在 x86 中使用方括号
Using square brackets in x86
我想得到 2 个不同的东西:
(1) the (value at bp) plus 16(数学加法)类似于:mov ax, [bp] + 16
(2)bp+16的值(地址bp+16)
为了获得 (1) 我尝试了:
mov ax, bp+16
但是报错了。
for (2) 我试过:
mov ax, [bp+16]
哪个有效。 (我希望我做对了)..
为什么程序集无法理解以下的评估:
mov ax, bp+16
但能看懂:
mov ax, [bp+16]
因为不使用+
符号定义加法,那么幕后发生了什么?
没有任何形式的 mov
可以通过数学计算为目标寄存器生成不在源寄存器或内存操作数中的新值。 https://www.felixcloutier.com/x86/mov。您在 AX 中想要的值必须是立即数,或者直接包含在寄存器或内存中的某个地址。
如果您想要值 bp+16
而不是该地址的内存,请使用 lea ax, [bp+16]
而不是 mov
。 Load Effective Address 进行地址计算,然后将该地址放入目标寄存器,而不是从中加载。 。复制和添加很方便。 (或使用 32 位寻址模式,也进行移位。)
(就完整 seg:off x86 寻址而言,LEA 仅执行 "offset" 部分,即 "effective address";它不添加段基址,因此 SS:BP与 DS:DI 或任何无关紧要的东西。)
做mov ax, [bp+16]
是有效的,因为[]
表示解引用为内存操作数,x86 16-bit addressing modes支持寄存器+位移
我想得到 2 个不同的东西:
(1) the (value at bp) plus 16(数学加法)类似于:mov ax, [bp] + 16
(2)bp+16的值(地址bp+16)
为了获得 (1) 我尝试了:
mov ax, bp+16
但是报错了。
for (2) 我试过:
mov ax, [bp+16]
哪个有效。 (我希望我做对了)..
为什么程序集无法理解以下的评估:
mov ax, bp+16
但能看懂:
mov ax, [bp+16]
因为不使用+
符号定义加法,那么幕后发生了什么?
没有任何形式的 mov
可以通过数学计算为目标寄存器生成不在源寄存器或内存操作数中的新值。 https://www.felixcloutier.com/x86/mov。您在 AX 中想要的值必须是立即数,或者直接包含在寄存器或内存中的某个地址。
如果您想要值 bp+16
而不是该地址的内存,请使用 lea ax, [bp+16]
而不是 mov
。 Load Effective Address 进行地址计算,然后将该地址放入目标寄存器,而不是从中加载。
(就完整 seg:off x86 寻址而言,LEA 仅执行 "offset" 部分,即 "effective address";它不添加段基址,因此 SS:BP与 DS:DI 或任何无关紧要的东西。)
做mov ax, [bp+16]
是有效的,因为[]
表示解引用为内存操作数,x86 16-bit addressing modes支持寄存器+位移