【发布时间】:2015-12-23 12:22:22
【问题描述】:
当然MOV“移动”(实际上是复制)一些东西,但是如何?它是将源中的实际值放入目的地还是放入某种地址。
当我在 Jeff Duntemann 介绍性汇编书中看到他正在使用 Linux 的 80h 中断时,我想到了这个问题:
mov eax,4 ; Specify sys_write call
mov ebx,1 ; Specify File Descriptor 1: Standard output
mov ecx,Buff ; Pass address of the character to write
mov edx,1 ; Pass number of chars to write
int 80h ; Call sys_write
在开始阅读之前,我几乎没有练习过 TASM,但知道 LEA 指令。所以当我看到:
mov ecx,Buff ; Pass address of the character to write
这让我大吃一惊,因为我使用 LEA(加载有效地址)或 OFFSET 将地址放入寄存器,而他正在使用 MOV。
两种形式都正确吗?不过,他正在使用 NASM,是因为汇编程序吗?我现在很困惑,因为我习惯于看到 MOV 将值而不是地址。
【问题讨论】:
-
是的,这是因为不同的汇编器不幸使用不同的语法。我在stackoverflow.com/questions/34058101/… 的回答中介绍了
label作为源操作数(除其他外)的MASM 和NASM 语法之间的区别。您可能会发现其中一些有用(或者没有,IDK!)通常当您使用LEA将地址放入寄存器(而不是mov reg, imm32)时,它在 64 位模式下获得 RIP 相对寻址(位置独立于不需要搬家。)