将变量的内容移动到另一个变量中

Dan*_*iel 2 assembly masm32

在我看来,这是一个非常愚蠢的问题,但我找不到答案。

有没有其他方法可以将数据变量内容传递给另一个变量,而不是使用推送/弹出,或者首先将其移动到寄存器?

我的意思是这样的:

.data

txt dd 1
txt1 dd 2

.code 

start:

mov txt1, txt

;or - mov [txt1], txt

ret

end start
Run Code Online (Sandbox Code Playgroud)

wal*_*lyk 5

在 8086 系列中,最简单的方法是使用中间寄存器:

   mov   eax, txt
   mov   txt1, eax
Run Code Online (Sandbox Code Playgroud)

许多非英特尔 CISC 架构提供直接内存到内存移动指令。RISC 架构很少这样做。

如果不止这些,使用字符串移动指令可能更简单,它需要设置 ESI 和 EDI 寄存器、DF 标志,如果你想使用rep前缀,ECX 寄存器:

 lea  edi, dest   ; or mov edi, offset dest.  Shorter encoding.  Only use LEA for 64bit RIP-relative addressing.
 lea  esi, src
 cld
 movsd       ; moves 32-bit value [ESI] to [EDI] and increments both pointers
 movsd       ; moves another
Run Code Online (Sandbox Code Playgroud)

显然,一两个词不值得,但是如果您有人为的约束(没有中间寄存器,没有推送/弹出),那么这可能满足条件。

如果你的函数可以假设它的调用者都严格遵循标准调用约定,你可以假设在函数进入时方向标志已经被清除。引导加载程序代码应该尽可能少地假设初始状态,因为不同的 BIOS 会以不同的状态跳转到它。