Прямая и косвенная адресация и ОФСЕТ - PullRequest
0 голосов
/ 10 мая 2018

Я довольно новичок в сборке и пытаюсь решить этот вопрос из прошлого экзамена. Я застрял в необходимости помощи, извинения, если это является основным.

У меня есть следующий код:

                 .MODEL medium
                 .STACK
0000             .DATA
0000 04D2 10E1   Count dw 1234,4321
0000            .CODE
                .STARTUP
0017 BB 0000 R   mov bx, OFFSET Count
001A B8 000A     mov ax,10
001D 8B C3       mov ax,bx
001F 8B 07       mov ax,[bx]
0021 A1 0000 R   mov ax,Count
.EXIT
END

Меня просят определить различные типы адресации, которые я могу сделать, и затем указывать значение ax после каждой инструкции.

В частности, я не знаю, как разработать последние 3 инструкции. Итак, мои вопросы:

  1. Какое значение хранится в bx? Это адрес Количество ? Как мне найти этот адрес?

  2. После инструкции mov ax,[bx] Я вполне уверен, ax содержит значение Count . Что это за значение?

  3. mov ax,Count Это то же самое, что 2?

1 Ответ

0 голосов
/ 10 мая 2018

Вы были слишком заняты. Ваш учитель объяснит это подробно. Модными словами являются «сегмент / смещение» и «организация программы .exe в памяти». Кратко:

  1. bx получает смещение Count.

    Адрес x86-16 разделен на две части: сегмент и смещение. Мой Turbo Debugger устанавливает Count на адрес 1603: 0000. Первое (шестнадцатеричное) число обозначает сегмент, второе - смещение. Сегмент будет рассчитываться операционной системой при загрузке программы и может меняться при каждом запуске программы. Директива .STARTUP создает код, который присваивает вычисленное значение регистру сегмента DS (не путайте его с регистром общего назначения DX).

    Смещение - это относительное расстояние от начала адреса этого сегмента. Поскольку Count находится в начале сегмента .DATA, его относительное расстояние от начала сегмента равно 0000. Итак, BX = 0000.

  2. Значения Count инициализируются Count dw 1234,4321. Count - это не переменная, а метка. На этом ярлыке вы можете найти два слова: 1234 и 4321. mov ax,[bx] загрузит слово с адреса DS: 0000, и это адрес Count.

    Ваше предположение верно, mov ax,[bx] содержит первое значение Count = 1234. Число десятичное.

  3. Это зависит от ассемблера. В синтаксисе MASM он такой же, как 2, в синтаксисе NASM он такой же, как 1. Код, очевидно, MASM, поэтому он такой же, как 2. В конце концов, то же самое: инструкции разные.

...