相关疑难解决方法(0)

如何使用printf为64位Mac OS X编写汇编语言hello world程序?

我正在努力学习为64位Mac OS编写汇编语言.我对32位Mac OS以及32位和64位Linux没有任何问题.

但是,Mac OS 64位是不同的,我无法弄清楚.因此,我在这里寻求帮助.

我没有使用系统调用打印的问题.但是,我想学习如何使用Mac OS的64位汇编语言调用C函数.

请查看以下代码

.data
_hello:
    .asciz "Hello, world\n"


.text
.globl _main
_main:
    movq $0, %rax
    movq _hello(%rip), %rdi
    call _printf
Run Code Online (Sandbox Code Playgroud)

我使用$ gcc -arch x86_64 hello.s

组装和链接.

它生成二进制代码.但是,运行它时出现了分段错误.

我在调用_printf之前尝试添加"subq $ 8,%rsp",仍然和以前一样.

我做错了什么?

顺便说一下,这是在Mac上调试此代码的任何方法吗?我尝试添加-ggdb或-gstab或-gDWARF和$ gdb ./a.out,但无法查看代码并设置断点.

macos 64-bit assembly printf 32bit-64bit

14
推荐指数
1
解决办法
8977
查看次数

使用GNU汇编程序在x86_64中调用printf

我用AT&T语法编写了一个程序,用于GNU汇编程序:

            .data
format:   .ascii "%d\n"  

            .text
            .global main  
main:
            mov    $format, %rbx
            mov    (%rbx), %rdi
            mov    $1, %rsi
            call     printf
            ret
Run Code Online (Sandbox Code Playgroud)

我使用GCC来组装和链接:

gcc -o main main.s

我用这个命令运行它:

./主要

当我运行程序时,我得到一个seg错误.通过使用gdb,它说printf没有找到.我试过".extern printf",但是没有用.有人建议我应该printfRET之前存储堆栈指针并在RET之前恢复,我该怎么做?

linux assembly gcc x86-64 gnu-assembler

8
推荐指数
2
解决办法
2万
查看次数

标签 统计

assembly ×2

32bit-64bit ×1

64-bit ×1

gcc ×1

gnu-assembler ×1

linux ×1

macos ×1

printf ×1

x86-64 ×1