Подскажите чем фактически отличается 16 битный и 32 битный код ? Выполняет ли 32 битный процессор в реальном режиме 32 битный код ? или только 16 битный ? Можно ли получить доступ к расширенным регистрам х86 (таким как eax). Или доступ к 32 битным регистрам может получит только 32 битный код. За раннее спасибо. P.S Прошу прошения за ламерские вопросы
Мне кажется, что Вы путаете понятия real mode vs. protected и 16 bit vs. 32 bit. 32-битный проц выполняет 16-битный код (с сегментной адресацией как в старом добром досе) в режиме V86, но это совсем не реальный режим. Почитайте Art of Assembly (в разделе док).
Ок, спасибо, Art of Assembly я конечно почитаю, как только до него доберусь, сейчас нет возможности(под руками есть только второе издание Юрова серия учебник для вузов) но все-таки чем отличается 16 битный код от 32 битного и соответственно 32 битный от 64 битного. Кроме того что доступна большая разрядность регистров ? А про отличие реального режима от защищенного и виртуального я прочитал, и насколько я понял, в реальном режиме проц запускается и работает в режиме совместимости с 8086 адресует 1 мб памяти, и выполняет 16 битный код, тут сразу напрашивается вопрос можно ли в реальном режиме подсунуть процессору инструкцию для работы с 32 битным регистром, например eax ? что будет если процу в реальном режиме подсунуть инструкцию введенную например в 286 процессоре или новее, выполнит ли он ее нет ? может ли он выполнять 32 битный код в реальном режиме или только 16 битный. Вот потом проц переводят в защищенный режим , меняется адресация памяти и проц может адресовать все 4гб и тд, проц начинает выполнять только 32 код ? (выполняет ли он 16 битный код прямо в защищенном режиме без переключения в виртуальный режим ? ) Если оси понадобилось в защищенном режиме выполнить старое ДОС приложение (16 битное) то она переключает процессор в виртуальный режим проц сного может адресовать 1мб (весь мегобайт специально выделен для этого приложения и оно не знает что оно не одно)(насколько я понимаю это происходи непосредственно для задачи которой это необходимо как только у нее заканчивается квант времени и проц переходит на другую задачу он выходит из виртуального режима) так ? Вот например есть два транслятора например tasm и tasm32 ими можно оттранслировать совершенно одинаковый ассемблерный листинг и получить соответственно 16 битный и 32 битный код, так в чем же будет отличии между этими кодами ? Поправте если где не прав. ок ? Зараннее спасибо.
Я не отвечу Ваш вопрос(ы) но свое мнение скажу. Юров очень хорошая книга, но оочень хочется под нее вздремнуть, если решил учить ассемблер лучше оставить это ретро, а также отказатся от тасма, поскольку он уже (давненько) не поддерживается борландом и ты только тратишь свое время изучяя его (тасм), перейди например на masm32 или fasm и прочитай туториалы Iczliona (если еще не прочитал). И не понимаю зачем нужно писать проги под дос, в 16 битном режиме, на дворе 2006 год, я например могу понять для чего изучать ассемблер для Линукса - хоть и не часто приходится встречатся с линуксом но он все чаще используется - так что ассемблер под линукс это еще и вложение в будущее (поскольку за ним будущее, кто не верит поверит когда майкрософт возьмется всерьез за СНГ), а дос - от него грубо говоря почти такая же польза как от .bat файлов - чтото эфемерное что и толковой программой нельзя назвать но и пустым местом не назовешь, поправьте меня если я не прав.
xlinuks Да я конечно согласен с тем что дос свое уже отжил, это без спорно, просто при изучении практически любого языка нужно начинать именно с языка а не с тонкостей устройства ос, темболее что системные вызовы тогоже линукса весьма похожи на досовские (если не прав поправте). Тасм я не изучаю, пока что ставлю эксперименты на masm 6.12 потом планирую перейти на fasm. но сначало надо разобратся с архитектурой проца, а это сделать намного проше из под того же доса, чем парится с окоными приложениями в винде. Вот а про микрософт и снг, ну-ну пусть сначало возьмется, а потом уже и будем рассуждать. Кстати а что за туториалы Iczliona, и самое главное где их взять ? Яндекс чтото молчит P.S Кстати кому интересна тема програмирования на ассемблере под linux очень рекомендую почитать Wrox.Professional.Assembly.Language.Jan.2005.ISBN0764579010.pdf
IczEliona, http://www.wasm.ru/publist.php?list=1 (пропустил букву в имени автора) Желательно прочитать его, здесь с его туториалом знакомы практически все, вероятно потому что лучше пока никто не написал, хотя опечатки так никто и не потрудился исправить :P
чтобы изучать как работает видовс программа юзай OllyDbg, и изучиш архитектуру проца,там тебе и все регистры и стек покажут,а досовские можно только из под эмулятора(или в реальном досе).
избыточное цитирование. следите за этим Вообще, вопрос довольно таки объемный. И в PM и в RM можно использовать и 16 и 32 бита. Инструкция 16 бит практически не отличается от инструкции 32 бита (разве что размером непосредственного операнда) -- в зависимости от бита D (он находится в дескрипторе сегмента, а не в самой инструкции). Поэтому одна и та же инструкция м.б. проинтерпретирована по-разному. Изменить интерпретацию (инвертировать значение бита D на время выполнения инструкции) можно с помощью специальных префиксов замены размера операнда и размера адреса. Когда процессор начинает работу (после сигнала RESET) этот бит сброшен в 0, поэтому код интерпретируется как 16 бит. Если ты используешь директиву асемблера, указав, что код 16 бит и используешь в коде регистр/адресацию 32 бита, то асемблер вставит префикс замены размера операнда/адреса и сможешь использовать 32 бита и в RM. Чтобы использовать 16 бит находясь в PM, опять же потребуется префикс замены. Теперь бит D = 1, так что добраться до 16 бит другого способа нет. (Разве что только GDT подправить, добавив свой дескриптор ). Но в целом тонкостей много (например, код 8 бит можно использовать независимо от значения бита D, + при работе со стеком биты D берется из сегмента стека и влияет только на указатель стека sp/esp), так что лучше почитать Григорьева или мануалы -- там это все весьма доходчиво написано.
Огромное всем спасибо за разяснения, вроде понял. Пойду читать доки и в часности Intel Architecture Software Developer’s Manual, а так еще раз спасибо.