Juan Pablo
Juan Pablo

Reputation: 653

NASM on DOS (Intel 8086): invalid effective address

I am writing code for DOS using Bochs. I am compiling the program using NASM
Lets suppose i have the following code:

[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

Why is it that nasm complains on the line:

mov al, byte [bx]

of invalid effective address?

If instead of using bx i use the si registry, the program compiles an works as supposed, loading the ascii value of t in al.

Why is it?

EDIT: Found that I can't use BX for indexing.
If I wanted to load what's pointed in a determined part of the data segment, you could do the following:

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

If I wanted to keep si pointing to the start of the string, i could then use BX to be the offset:

mov al, byte [si + bx]

or even

mov al, byte [si + n] ; where n is an integer value

But to my understanding, bx could also be used, so the problem still resides.

Upvotes: 2

Views: 3843

Answers (2)

Gunther Piez
Gunther Piez

Reputation: 30429

I think you made more than one typo in your question :-) First of, in 16 bit mode [bp][bx][si][di] are all valid addressing modes. Even the old 8086 can use [bx] as an effective address. Where as [dx] can not be used in 16 bit mode, afaik it needs to be running in 32 bit mode. Together with your line

mov dx, msg

preceding

mov al, byte [bx]

I assume you wrote in fact 'mov al, [dx]' and nasm is correctly complaining about [dx] as an invalid address. So if you meant, you found out you can't use [bx], you were wrong - you found out that you need to take more care in not misspelling "b" for "d".

Upvotes: 3

Jens Björnhager
Jens Björnhager

Reputation: 5649

You sure the error is not on this line?

mov ds, data

Perhaps you meant:

mov ds, ax

Upvotes: 1

Related Questions