16 бит / 32 бит x86 - PullRequest
       3

16 бит / 32 бит x86

1 голос
/ 23 марта 2012

Вопрос учебного пособия: я понятия не имею, в чем разница между написанием его в 16-битном и 32-битном.Кто-нибудь может прояснить, как это что-то меняет?

Напишите программу сборки 80x86, которая добавит в память целые числа со знаком размера слова и остановится, когда увидит ноль.Сумма всегда будет больше -32768 и меньше 32767. Сумма должна быть записана в память.Если в строке целых чисел находится только ноль, поместите всего 0.Используйте команду JNZ.(Если последняя операция приводит к нулевому переходу к метке.)

16-битное целое число DW 2, -300, 54, 30, 8 ,, - 240, 0 всего DW?

32-битноеintegs WORD 2, -300, 54, 30, 8 ,, - 240, 0 всего WORD?

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

В 32-битном коде есть несколько отличий от 16-битного:

  • Прежде всего, конечно, ваши регистры, индексы и чтения данных обычно имеют ширину 32 бита,(Вы можете изменить это с помощью префиксов размера адреса и размера операнда. Как правило, вы не будете использовать префикс размера адреса, но для 32-битного кода, читающего 16-битные слова, я могу видеть, что префикс размера операнда используется довольноНекоторые ассемблеры позаботятся об этом за вас.)

  • 32-битные регистры имеют имена, начинающиеся с E, и в основном являются расширениями 16-битных регистров.(Например, AX является младшим словом EAX. К сожалению, нет встроенного способа доступа к старшему слову. Вам придется повернуть или сдвинуть регистр, чтобы перейти к старшим 16 битам.)

  • Индексация также отличается.16-битный код гораздо более ограничен в том, как он может комбинировать регистры.Вы увидите много [BX+SI], но IIRC [AX+BX] даже не является законным.Это в 32-битном коде.Кроме того, 32-битный код может масштабировать первое слагаемое (времена 1, 2, 4 ... я забыл, разрешено ли 8).Например, [EBX*4+ECX].

  • В 16-битном коде регистры имеют довольно строгие цели;например, CX - это счетчик, BX - это в основном базовый указатель, SI и DI - это индексы, отсюда и их имена.Работать против этого - значит прыгать через обручи.В 32-битном коде это заметно ослаблено;в то время как регистры все еще в основном сохраняют свои специальные цели, более гибкая индексация позволяет практически любому свободному регистру служить индексом.

  • Защищенный режим почти всегда включен.(Есть особые случаи, но они больше не распространены. Чтобы увидеть это, вам нужно написать игру для DOS или что-то в этом роде; каждая приличная ОС сразу же переходит в защищенный режим.) Существует множество ограничений и тому подобное.которые идут вместе с этим.Большинство из них будут невидимы для вас, если вы не попробуете делать что-то на уровне ядра.Большая часть 16-битного кода предназначена для работы в режиме «реального режима» или «виртуального 8086», где процессор в основном работает как очень быстрый 8086, в стиле фанк-адресации и все.

  • Ohда, обращаясь.16-битный код использует «сегменты», где регистры сегментов (CS, DS и т. Д.) Просто сдвигаются влево на 4 бита и добавляются к «смещению», чтобы получить 20-битное значение (максимум: 1 МБ).32-битный код далеко не такой обычный, но и далеко не ограниченный;он повторно использует регистры сегментов как «селекторы», которые могут указывать практически на любое место в адресном пространстве ЦП, но должны быть установлены в таблице дескрипторов (GDT или LDT).На практике 32-битный код почти всегда устанавливает все сегменты так, чтобы они указывали на одну и ту же область памяти.Это называется «плоская модель», и на сегодняшний день это самая распространенная установка.16-битный код имеет около полудюжины различных моделей памяти, в зависимости от того, насколько большим должен быть код и данные.

Директивы / инструкции для необработанных данных обычно одинаковы;DW все еще обычно означает «это слово», DD означает «это меч» и т. Д.

Кстати, «x86» и «80x86» обычно подразумевают «32-битный»- в основном потому, что этот термин не был распространен до появления 32-битных процессоров.

0 голосов
/ 23 марта 2012

Код ассемблера отличается, а сгенерированный объектный код отличается. Ваше учебное пособие доисторическое, забудьте о 16-битном и запишите его в 32-битном (или 64!). Когда ваш профессор / преподаватель говорит, что ограничения суммы настоятельно рекомендуют запрашивать 16-битный код, скажите «Только динозавры помнят 16-битный код» (вы можете подумать о резервном курсе:).

Кажется, я неправильно понял ваш вопрос? Если учебное пособие не дает вам выбора, тогда да, вы застряли с 16-разрядными инструкциями и старыми 16-разрядными регистрами - AX, BX, CX, DX, ПК, SP, SI, DI и, возможно, сегментными регистрами. а также.

Я понятия не имею, как на самом деле генерировать 16-битный код в наши дни, особенно на 64-битном компьютере, у которого вообще проблемы с выполнением 16-битного кода. На 32-битном компьютере или с помощью некоторой утилиты, такой как DosBox, вы можете запустить старый ассемблер MASM, а затем исполняемый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...