Mat*_*ker 0 assembly tasm x86-16
我想得到 2 个不同的东西:
(1)(bp 处的值)加16(数学加法)类似于:mov ax, [bp] + 16
(2)bp+16 的值(地址 bp+16)
为了得到(1)我试过:
mov ax, bp+16
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误。
对于(2)我试过:
mov ax, [bp+16]
Run Code Online (Sandbox Code Playgroud)
哪个有效。(我希望我做对了)。
为什么汇编看不懂评价:
mov ax, bp+16
Run Code Online (Sandbox Code Playgroud)
但是可以理解:
mov ax, [bp+16]
Run Code Online (Sandbox Code Playgroud)
因为加法不是使用+符号定义的,那么幕后发生了什么?
没有任何形式mov可以通过数学运算为不在源寄存器或内存操作数中的目标寄存器生成新值。 https://www.felixcloutier.com/x86/mov。您想要在 AX 中的值必须是立即数,或者直接包含在某个地址的寄存器或内存中。
如果您想要该bp+16地址的值而不是内存,请使用lea ax, [bp+16]而不是mov。加载有效地址进行地址计算,然后将该地址放入目标寄存器,而不是从中加载。 LEA 只是一个使用内存操作数语法和机器编码的数学指令。作为复制和添加很方便。(或者使用 32 位寻址模式,也可以移位。)
(就完整的 seg:off x86 寻址而言,LEA 仅执行“偏移”部分,即“有效地址”;它不添加段基址,因此 SS:BP 与 DS:DI 或其他无关紧要。)
这样做mov ax, [bp+16]是有效的,因为[]意味着取消引用作为内存操作数,并且x86 16 位寻址模式支持寄存器 + 位移。