Assembly 移动变量';将内容转换为另一个变量
在我看来,这是一个非常愚蠢的问题,但我找不到答案 是否有其他方法可以将数据变量内容传递给另一个变量,而不使用push/pop或先将其移动到寄存器 我的意思是: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,
.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个通用寄存器(除了堆栈指针),您可以也应该使用这些寄存器。