Почему эта последовательность MOV и ADD с памятью производит AX = 90FFh? - PullRequest
1 голос
/ 29 мая 2019

У меня действительно проблема с MOV AX,[SI].Я не понимаю, почему конечный результат AH=90h AL=FFh.

ORG 100h
MOV [110h],80h
MOV SI,110h
ADD [SI], 7Fh
MOV AX, [SI]

1 Ответ

4 голосов
/ 30 мая 2019

Инструкции типа mov [110h], 80h и add [si], 7Fh неоднозначны, потому что ассемблер не знает, какого размера вы хотите, чтобы они имели. Вы хотите обработать байтов (1 байт) или хотите иметь дело с словами (2 байта)?

Видимо emu8086 выбирает размер байта по умолчанию!

Байт по адресу 110h был заполнен на 80h, позже поднялся на 7Fh, что привело к FFh, но затем вы начали читать целое слово по адресу 110h. Вы получили правильную сумму в AL, а AH получил любой мусор в памяти по адресу 111h .

Лучше всегда указывайте нужный размер:

  • слова

    ORG     100h
    mov     word ptr [0110h], 0080h
    mov     si, 0110h
    add     word ptr [si], 007Fh
    mov     ax, [si]        >>>> AX=01FFh  AH=01h AL=FFh
    
  • байт

    ORG     100h
    mov     byte ptr [0110h], 80h
    mov     si, 0110h
    add     byte ptr [si], 7Fh
    mov     ax, [si]        >>>> AX=??FFh  AH=??h AL=FFh
    

    Возможно, использование mov al, [si] было бы более уместным в этом случае.


Обратите внимание на длину программы.

В зависимости от версии эта маленькая программа имеет 13 или 14 байтов. Это означает, что он не попадает в память по адресу 110h. Если бы это было так, инструкции могли бы повредить программу и, возможно, привести к сбою компьютера. Вы можете хранить номера в другом месте, чтобы быть в безопасности, например, адрес 1000h, оставляя больше места для экспериментов с набором инструкций ...

...