2015-04-01 58 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(加载有效地址),指令计算内存源操作数和场所的有效地址(内的偏移) 它在一个通用寄存器中。

所以,是的,我会说你的结果是预期的结果。