我正在尝试使用nasm在x86程序集中编写一个简单的引导程序。在代码中的几个地方,我必须使用[es:di]
形式的有效地址。代码编译时没有错误,但在运行时,段被忽略。例如,
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
。问题发生在程序的任何一点(包括以前什么也没做过),程序以实模式运行。
我的问题是:这是正常的吗?我错过了什么吗?我该如何解决这个问题?
答案 0 :(得分:4)
英特尔的手册可能不是很清楚。或者至少在哪里看起来可能并不明显。但如果您阅读第7.3.16.1节(Address Computation Instruction
),则说:
LEA
(加载有效地址)指令计算内存中的有效地址(段内的偏移量) 源操作数的一部分,并将其放在通用寄存器中。
所以,是的,我说你的结果是预期的结果。