Как я могу определить результат в AX после инструкций MOV и LEA? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь понять, что будет содержаться в регистре AX в следующем вопросе, я не понимаю, как узнать, что такое [5000h] или [DI] в примерах.

Состояние регистров и памяти определяется как:

CS=3000 [53000]=BBBB [33000]=6666 [13000]=1111
DS=1000 [54000]=CCCC [34000]=7777 [14000]=2222
SS=5000 [55000]=DDDD [35000]=8888 [15000]=3333
DI=7000 [56000]=EEEE [36000]=9999 [16000]=4444
BP=4000 [57000]=FFFF [37000]=AAAA [17000]=5555

Какое значение в AX для каждой из этих инструкций

  • MOV AX, [DI]
  • MOV AX, [5000h]
  • MOV AX, [BP+2000h]
  • LEA AX, [BP+1000h]

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Это академический вопрос, но он затрагивает ряд концепций реального режима 20-битный сегмент: смещение адресации .Все адреса памяти в реальном режиме всегда состоят из двух частей - сегмента и смещения.Две части объединяются вместе для создания физического адреса по формуле:

Physical Address = segment * 16 + offset

или

Physical Address = segment << 4 + offset

Обе дают тот же результат, что и сдвиг чего-либо влево 4биты - это то же самое, что умножение на 16 десятичных (или шестнадцатеричных 10h).

Вы обнаружите, что инструкции могут явно указывать сегмент, а когда он не указан, всегда есть неявный.Общее правило состоит в том, что если адрес памяти использует BP , то операнд памяти относится к сегменту SS , в противном случае он относится к сегменту DS .

Инструкция LEA на самом деле не обращается к физической памяти, она просто вычисляет эффективный адрес операнда памяти и загружает адрес в регистр.С LEA сегмент не входит в игру.Инструкция MOV с операндом памяти переместит содержимое операнда памяти в / из регистра.


Все значения, заданные в ваших вопросах, приведены в шестнадцатеричном формате.Чтобы ответить на ваши вопросы:

  • MOV AX, [DI] совпадает с MOV AX, [DS:DI], поскольку подразумеваемый сегмент равен DS .В вопросе DS = 1000ч. DI = 7000h.Смещение составляет DI .Используя формулу сегмента << 4 + смещение, мы получаем физический адрес 1000h << 4 + 7000h = 10000h + 7000h = 17000h.Вопрос указывает адрес памяти <code>[17000]=5555, поэтому значение, перемещаемое в AX, равно 5555 ч.

  • MOV AX, [5000h] совпадает с MOV AX, [DS:5000h], поскольку подразумеваемый сегмент равен DS .В вопросе DS = 1000ч.Смещение 5000ч.Используя формулу сегмента << 4 + смещение, мы получаем физический адрес 1000h << 4 + 5000h = 10000h + 5000h = 15000h.Вопрос указывает адрес памяти <code>[15000]=3333, поэтому значение, перемещаемое в AX, составляет 3333 ч.

  • MOV AX, [BP+2000h] совпадает с MOV AX, [SS:BP+2000h], поскольку подразумеваемый сегмент равен SS .В вопросе SS = 5000h и BP = 4000h.Смещение составляет BP + 2000h.С помощью сегмента формулы << 4 + смещение мы получаем физический адрес 5000h << 4+ (4000h + 2000h) = 50000h + (4000h + 2000h) = 56000h.В вопросе указан адрес памяти <code>[56000]=EEEE, поэтому значение, перемещаемое в AX, равно EEEEh.

  • LEA AX, [BP+1000h]: сегмент не вступает в игру, поскольку он является LEA инструкцией.В вопросе BP = 4000ч.Смещение составляет BP + 1000h = 4000h + 1000h = 5000h.Так как LEA только вычисляет и сохраняет адрес в регистре, значение в AX будет 5000h.

0 голосов
/ 28 января 2019

[Мой ответ оставлен здесь для справки, но я забрал его.Из информации, которую вы предоставили, я понял, что ваш процессор x86 работает в привилегированном режиме совместимости с 8086, как при загрузке.К сожалению, у меня нет опыта в написании загрузчиков.]

Старые данные в регистре перезаписываются при поступлении новых данных.Следовательно, только команда LEA влияет на этот результат.

Более того, команда LEA является особенной: она не разыменовывает адрес, который она вычисляет.В вашем примере, поскольку BP содержит 4000h, адрес, который вычисляет LEA, равен 4000h + 1000h == 5000h.Последний адрес не используется, , но просто сохраняется для будущего использования в регистре AX.

Поэтому в конце выполнения этого кода регистр AX будет содержать значение 5000h.

Чтобы уточнить, я не говорил, что в регистре AX будет храниться копия данных, хранящихся в памяти по адресу 5000h.Скорее я сказал что-то попроще: регистр AX будет содержать значение 5000h.

...