Assembly 移动变量';将内容转换为另一个变量

Assembly 移动变量';将内容转换为另一个变量,assembly,masm32,Assembly,Masm32,在我看来,这是一个非常愚蠢的问题,但我找不到答案 是否有其他方法可以将数据变量内容传递给另一个变量,而不使用push/pop或先将其移动到寄存器 我的意思是: .data txt dd 1 txt1 dd 2 .code start: mov txt1, txt ;or - mov [txt1], txt ret end start 在8086系列中,最简单的方法是使用中间寄存器: mov eax, txt mov txt1, eax lea edi,

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

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

我的意思是:

.data

txt dd 1
txt1 dd 2

.code 

start:

mov txt1, txt

;or - mov [txt1], txt

ret

end start

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

   mov   eax, txt
   mov   txt1, eax
 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
许多非英特尔CISC体系结构提供直接内存到内存移动指令。RISC架构很少这样做

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

   mov   eax, txt
   mov   txt1, eax
 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
很明显,这不值得花一两个字,但是如果你有人为的限制(没有中间寄存器,没有push/pop),那么这可能满足条件


如果您的函数可以假定其调用者都严格遵守标准调用约定,那么您可以假定在函数项上已清除了方向标志。引导加载程序代码应尽可能少地假设初始状态,因为不同的BIOS会以不同的状态跳转到初始状态。

几乎所有非英特尔体系结构都提供直接的mem move指令?大多数非英特尔体系结构是RISC,而不是CISC,RISC体系结构通常是加载/存储机器。我测试了
inta,b;godbolt上的void foo(){a=b;}
和ARM/ARM64/PPC/AVR都使用暂存器加载/存储。x86的
movs
指令是不寻常的。@PeterCordes:虽然最近的设计似乎倾向于RISC,但x86显然是一种没有mem-to-mem移动的CISC设计。然而,M68K、NS320x、Rx、Vax、8051系列,甚至Z80都是CISC。我已经修改了这一评论。谢谢。不要把变量看作仅仅是一个内存位置。变量可以是寄存器中的活变量,也可以是内存中的死变量。您可以而且应该尽可能多地将变量保存在寄存器中,只在需要时才将它们溢出到内存中。32位x86有7个通用寄存器(除了堆栈指针),您可以也应该使用这些寄存器。