2015-04-01 27 views
1

我正嘗試在使用nasm的x86程序集中編寫一個簡單的bootloader。在代碼的幾個地方,我必須使用形式爲[es:di]的有效地址。代碼編譯沒有錯誤,但在運行時,段被忽略。例如,對於在使用nasm的有效地址中忽略的段

mov ax, 0x07C0 
mov es, ax 
mov di, 0x10 
lea eax, [es:di] 

lea後立刻寄存器的樣子:

EAX=00000010 
EDI=00000010 
ES =07c0 00007c00 0000ffff 00009300 

但EAX應該已經7C10。問題發生在程序的任何位置(包括以前沒有做過任何事情),並且程序以實模式運行。

我的問題是:這是正常的嗎?我錯過了什麼嗎?我怎樣才能解決這個問題?

回答

4

英特爾的手冊可能不是非常明確。至少在哪裏看,可能並不明顯。但是,如果你讀條7.3.16.1(Address Computation Instruction),它說:

LEA(加載有效地址),指令計算內存源操作數和場所的有效地址(內的偏移) 它在一個通用寄存器中。

所以,是的,我會說你的結果是預期的結果。