Как я могу определить результат в AX после инструкций MOV и LEA?
Я пытаюсь понять, каким будет содержимое регистра 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 ответа
Это академический вопрос, но он затрагивает ряд концепций 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 = 7000 ч. Смещение DI. Используя формулу сегмента <<4 + смещение, мы получаем физический адрес 1000h<<4+7000h = 10000h+7000h=17000h. Вопрос состояния памяти[17000]=5555
поэтому значение, переведенное в AX, равно 5555h.MOV AX, [5000h]
такой же какMOV AX, [DS:5000h]
поскольку подразумеваемый сегмент является DS. В вопросе DS = 1000ч. Смещение 5000ч. Используя формулу сегмента <<4 + смещение, мы получаем физический адрес 1000h<<4+5000h = 10000h+5000h=15000h . Вопрос состояния памяти[15000]=3333
поэтому значение, переведенное в AX, равно 3333h.MOV AX, [BP+2000h]
такой же какMOV AX, [SS:BP+2000h]
поскольку подразумеваемый сегмент SS. В вопросе SS = 5000ч и BP =4000ч. Смещение составляет BP + 2000h. С помощью сегмента формулы <<4 + смещение мы получаем физический адрес 5000h<<4+(4000h+2000h) = 50000h+(4000h+2000h)=56000h. Вопрос состояния памяти[56000]=EEEE
поэтому значение, перемещенное в AX, равно EEEEh.LEA AX, [BP+1000h]
: Сегмент не вступает в игру, так как этоLEA
инструкция. В вопросе БП =4000ч. Смещение составляет BP + 1000h =4000h + 1000h = 5000h . посколькуLEA
только вычисляет и сохраняет адрес в регистре, значение в AX будет 5000h .
[Мой ответ оставлен здесь для справки, но я отозвал его. Из информации, которую вы предоставили, я понял, что ваш процессор x86 работает в привилегированном режиме совместимости с 8086, как при загрузке. У меня нет опыта написания загрузчиков, к сожалению.]
Старые данные в регистре перезаписываются при поступлении новых данных. Следовательно, только инструкция LEA влияет на этот результат.
Более того, инструкция LEA является особенной: она не разыменовывает адрес, который она вычисляет. В вашем примере, поскольку BP содержит 4000h, адрес, который вычисляет LEA, равен 4000h + 1000h == 5000h. Последний адрес не используется, а просто сохраняется для будущего использования в регистре AX.
Поэтому в конце выполнения этого кода регистр AX будет содержать значение 5000h.
Чтобы уточнить, я не сказал, что в регистре AX будет храниться копия данных, хранящихся в памяти по адресу 5000h. Скорее я сказал что-то попроще: регистр AX будет содержать значение 5000h.