Assembly 将内存位置推入堆栈
关于堆栈的Assembly 将内存位置推入堆栈,assembly,stack,masm,Assembly,Stack,Masm,关于堆栈的push命令的快速问题 命令PUSH[chr]的工作原理与MOV sum不同,firstparam的工作原理与前面解释的不同 那么为什么推送单词PTR[chr]起作用呢 *chr、sum和firstparam是由我在.DATA中定义的本地分配变量 提前谢谢 chr只是某个内存位置的名称。如果你只说push[chr],汇编程序怎么知道你要推多少字节?通过添加word ptr您清楚地表明您想要推送2字节的数据。我同意,但它仍然将数据从内存本身移动到内存的另一部分,如MOV sum,firs
push
命令的快速问题
命令PUSH[chr]
的工作原理与MOV sum不同,firstparam
的工作原理与前面解释的不同
那么为什么推送单词PTR[chr]
起作用呢
*chr、sum和firstparam是由我在.DATA中定义的本地分配变量
提前谢谢
chr
只是某个内存位置的名称。如果你只说push[chr]
,汇编程序怎么知道你要推多少字节?通过添加word ptr
您清楚地表明您想要推送2字节的数据。我同意,但它仍然将数据从内存本身移动到内存的另一部分,如MOV sum,firstparam
,不是吗?错误也一样(A2070)。push[chr]
不明确mov sum,firstparam
是不正确的,因为没有这种形式的mov
。这并不意味着有一些硬性规则规定指令不能同时读取和写入内存-只是这样的指令并不多,存在的指令通常有一个隐式的源和/或目标(例如,push
,pop
,movs
)。是的,所有指令要么具有隐式内存操作数(如[rsp+=8]
用于pop
),要么使用mod/rm+可选SIB字节中编码的有效地址。有一个主要的例外:mov-rax,m64
是从64位绝对地址加载的唯一方法,而不是32位符号扩展,并且它不使用mod/rm。请参阅“英特尔insn参考手册”(中的链接)。许多单操作数指令使用mod/rm字节的/r
字段作为额外的操作码位,例如区分not
和neg
,因为它们使用相同的操作码字节。另请参阅和