在我看来,这是一个非常愚蠢的问题,但我找不到答案。
有没有其他方法可以将数据变量内容传递给另一个变量,而不是使用push / pop,或者先将它移动到寄存器?
我的意思是这样的:
.data
txt dd 1
txt1 dd 2
.code
start:
mov txt1, txt
;or - mov [txt1], txt
ret
end start
答案 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会以不同的状态跳转到它。