Я пишу код для DOS, используя Bochs. Я компилирую программу, используя NASM
Предположим, у меня есть следующий код:
[BITS 16]
SEGMENT code
..start:
mov ax, data
mov ds, ax
mov bx, msg
mov al, byte [bx]
int 21h
SEGMENT data
msg DB "teststring", 00h
Почему носм жалуется на строчку:
mov al, byte [bx]
из неверный действующий адрес ?
Если вместо использования bx я использую реестр si , программа компилирует работы, как предполагалось, загружая значение ascii t в аль * +1021 *.
Почему это так?
РЕДАКТИРОВАТЬ: обнаружил, что я не могу использовать BX для индексации.
Если бы я хотел загрузить то, что указано в определенной части сегмента данных, вы могли бы сделать следующее:
mov ax, data
mov ds, ax
mov si, msg
mov al, byte [si] ; Loading first char
inc si
mov al, byte [si] ; Loading second char
Если бы я хотел, чтобы si указывал на начало строки, я мог бы использовать BX для смещения:
mov al, byte [si + bx]
или даже
mov al, byte [si + n] ; where n is an integer value
Но, насколько я понимаю, можно также использовать bx, поэтому проблема все еще сохраняется.