Macos 将32位程序集转换为64位程序集(Mac OS X)

Macos 将32位程序集转换为64位程序集(Mac OS X),macos,assembly,64-bit,Macos,Assembly,64 Bit,作为一个学习项目,我想将32位Exeve脚本从转换为64位。然而,当我尝试执行它时,我得到了一个分段错误。我用GDB检查了一下,找到了问题说明。我目前的代码如下: .section __DATA,__data .section __TEXT,__text .globl _main _main: xor %rax, %rax push %rax push $0x68732f6e push $0x69622f2f mov %rbx, %rsp ===>push %rax ;this is

作为一个学习项目,我想将32位Exeve脚本从转换为64位。然而,当我尝试执行它时,我得到了一个分段错误。我用GDB检查了一下,找到了问题说明。我目前的代码如下:

.section __DATA,__data
.section __TEXT,__text
.globl _main
_main:
xor %rax, %rax
push %rax

push $0x68732f6e
push $0x69622f2f

mov %rbx, %rsp

===>push %rax ;this is where the error occurs
mov %rdx, %rsp

push %rbx
mov %rcx, %rsp

mov %al, 11
int $0x80

使用Intel语法,而使用AT&T语法,但忘记了切换参数顺序。在英特尔语法中,参数顺序是dest,src,而在AT&T语法中,参数顺序是src,dest.FYI,这是不够的。64位系统调用约定不同,而且两次推送也不会创建连续字符串,因为它们也是64位的。使用Intel语法,而使用AT&T语法,但忘记了切换参数顺序。在英特尔语法中,参数顺序是dest,src,而在AT&T语法中,参数顺序是src,dest.FYI,这是不够的。64位系统调用约定不同,而且两次推送也不会创建连续字符串,因为它们也是64位的。