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

时间:2016-01-27 00:40:07

标签: assembly masm32

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

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

我的意思是这样的:

.data

txt dd 1
txt1 dd 2

.code 

start:

mov txt1, txt

;or - mov [txt1], txt

ret

end start

1 个答案:

答案 0 :(得分:4)

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

   mov   eax, txt
   mov   txt1, eax

许多非英特尔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

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

如果您的函数可以假定其调用者都严格遵循标准调用约定,则可以假设方向标志已在函数入口处清除。 Bootloader代码应尽可能少地假设初始状态,因为不同的BIOS会以不同的状态跳转到它。