Добавление смещения к адресу памяти - PullRequest
2 голосов
/ 02 мая 2019

У меня есть такой код (emu8086)

data segment
    str1 db "hello"
    len dw 4h
data ends

code segment
    ...
    ...
    mov si, offset str1
    lea di, [si + len]
code ends

Я бы ожидал, что это di укажет на адрес DS: 0004, однако сгенерированная инструкция LEA DI, [SI] + 021h.

Если вместо этого я использую:

lea di, [si + 4]

Тогда все работает как положено.

Как заставить первую версию работать аналогично второй?

1 Ответ

2 голосов
/ 02 мая 2019

Откуда приходит ваше "ожидаемое" 4?Если это из содержимого len dw 4h, то вам нужна загрузка, например, add si, [len].

lea не не обращаются к содержимому памяти.

x86 не имеет функции копирования и добавления с источником памяти, поэтому вам придется выбирать между «деструктивным» add с назначением регистра или lea, который просто выполняет математику срегистры + константы времени сборки

...