NASM на DOS (Intel 8086): неверный эффективный адрес - PullRequest
1 голос
/ 17 апреля 2011

Я пишу код для 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, поэтому проблема все еще сохраняется.

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

Я думаю, что вы сделали более одной опечатки в своем вопросе :-) Во-первых, в 16-битном режиме [bp] [bx] [si] [di] все допустимые режимы адресации. Даже старый 8086 может использовать [bx] в качестве эффективного адреса. Когда [dx] нельзя использовать в 16-битном режиме, на самом деле он должен работать в 32-битном режиме. Вместе с вашей линией

mov dx, msg

* предшествующий +1004 *

mov al, byte [bx]

Я предполагаю, что вы на самом деле написали 'mov al, [dx]', и nasm правильно жалуется на [dx] как неверный адрес. Таким образом, если вы имели в виду, вы узнали, что вы не можете использовать [bx], вы ошиблись - вы обнаружили, что вам нужно больше заботиться о том, чтобы не делать орфографические ошибки "b" для "d".

1 голос
/ 17 апреля 2011

Вы уверены, что ошибка не в этой строке?

mov ds, data

Возможно, вы имели в виду:

mov ds, ax
...