基本上你可以“删除”元素
通过添加到 rsp
寄存器从堆栈中
n * 8
,但如果您尝试相反的方法 (rsp - (n * 8)
)
它不起作用,这似乎很明显,但仍然
因此,如果我像这样使用 push
推送到堆栈:
push 10
push 20
所以堆栈基本上是(20; 10)
,我该如何制作它
(20; 10; 20; 10)
无需使用寄存器(因为你受到限制)
或者需要重复推送
但是如果不可能,最好使用哪个作为替代方案,
重复push
或使用寄存器使用pop
然后push
他们回来了吗?
最佳答案
假设n
和push
ed值是常量:
- 您的问题标记为 x86-64 ,所以我推测默认操作数大小当前设置为 64 位。
您的
push imm8
正在推送符号扩展的四字。 除非您确实需要在堆栈上使用四字,否则可以将 8 个单独的字节值放入堆栈中:
注意: 在长模式下,不可能仅push ((10 * 0x100 + 20) * 0x100 + 10) * 0x100 + 20 mov [rsp + 4], dword ((10 * 0x100 + 20) * 0x100 + 10) * 0x100 + 20
push imm32
,以便rsp ≔ rsp − 4
,因此是mov
。 - 如果您只是想避免一遍又一遍地使用相同的常量:
push 1234 push 5678 ; first copy push qword [rsp + 8] push qword [rsp + 8] ; second copy push qword [rsp + 8] push qword [rsp + 8]
- 但是,对于
push imm8
,我会简单地选择汇编器的扩展功能:repeat 3 push 10 push 20 end repeat
关于linux - 有没有办法将堆栈上的 `n` 数量的元素克隆到 x86_64 linux 程序集中的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72809433/