Reputation: 653
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
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
Reputation: 5649
You sure the error is not on this line?
mov ds, data
Perhaps you meant:
mov ds, ax
Upvotes: 1