linux - 有没有办法将堆栈上的 `n` 数量的元素克隆到 x86_64 linux 程序集中的堆栈?

标签 linux assembly stack x86-64 fasm

基本上你可以“删除”元素 通过添加到 rsp 寄存器从堆栈中 n * 8,但如果您尝试相反的方法 (rsp - (n * 8)) 它不起作用,这似乎很明显,但仍然

因此,如果我像这样使用 push 推送到堆栈:

push 10
push 20

所以堆栈基本上是(20; 10),我该如何制作它 (20; 10; 20; 10) 无需使用寄存器(因为你受到限制) 或者需要重复推送

但是如果不可能,最好使用哪个作为替代方案, 重复push或使用寄存器使用pop然后push 他们回来了吗?

最佳答案

假设npushed值是常量:

  • 您的问题标记为 ,所以我推测默认操作数大小当前设置为 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/

相关文章:

c - SDL+OpenGL 在 linux 下工作但在 windows 下不工作,不是编译器/链接器问题

c++ - 无法将 assimp 与 cmake 链接

assembly - 如何理解 x86-64 汇编的 'REX.W + B8+ rd io' 形式?

c++ - 我的汇编代码有什么问题

c++ - 如何影响_calling_函数的值返回?

regex - Sed - 删除字符串前的 x 个字符

linux - 如何使用 sed 在配置文件中注释和添加行

assembly - 在长模式下使用 64/32 位寄存器是否会受到任何惩罚?

c++ - 在 C++ 中使用链表实现堆栈,复制构造函数

assembly - 了解进入标签时 'stack' 在 gdb 中显示的内容