首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >难以让Hello / gas / Mac工作

难以让Hello / gas / Mac工作
EN

Stack Overflow用户
提问于 2012-10-15 18:59:05
回答 1查看 1.4K关注 0票数 1

我正试图用GNU汇编程序为Mac编写Hello,但在它打印"Hello“之前,它是总线错误。

hello.s

代码语言:javascript
代码运行次数:0
运行
复制
.global start

.data

.equ stdout, 1

.equ sys_write, 4
.equ sys_exit, 1

.equ kernel, 0x80

msg: .asciz "Hello World!\n"
.equ len, .-msg

.text

start:
    push $len
    push $msg
    push $stdout
    mov $sys_write, %eax
    sub $4, %esp
    int $kernel
    add $4 + $4 * $3, %esp

    push $0
    mov $sys_exit, %eax
    sub $4, %esp
    int $kernel

追踪:

代码语言:javascript
代码运行次数:0
运行
复制
$ clang -c -o hello.o hello.s
$ ld -o hello -macosx_version_min 10.6 hello.o
$ ./hello
Bus error: 10

$ gdb hello
(gdb) run
Starting program: /Users/andrew/Desktop/src/mcandre/gas/hello/freebsd/hello 

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x0000000000002000
0x0000000000002000 in msg ()

我的代码是基于以下几点:

我使用NASM / Mac的语义和Gas / Linux的语法。

我也尝试了GNU汇编程序维基百科页面上的示例程序,但它也是总线错误的。

我向苹果提交了一份错误报告,因为它的GNU汇编程序已经过时(如1.38)。他们说用clang代替。

我做错了什么?

规格:

  • ld64-134.9
  • clang 4.1
  • Xcode 4.5
  • Mac 10.8.2
  • MacBook Pro 2009
EN

回答 1

Stack Overflow用户

发布于 2012-10-15 22:20:50

因为你做错了什么,我不确定。我已经有一段时间没有使用程序集了,但是clang不喜欢我的mac上的.equ状态。当我换掉它们的时候,它运行得很好。(老实说,我更喜欢NASM,尽管我使用的是macport的。)

我创建了一个简单的.s文件,该文件将使用clang编译,字符串长度有一个问题。(也许是个窃听器?)我将长度存储在$len中,但是当我使用$len时,它不起作用。但用硬编码的数字就行了。

我用以下方法编译了代码:

代码语言:javascript
代码运行次数:0
运行
复制
clang -c -o hello.o hello.s -arch i386
ld -o hello -macosx_version_min 10.6 -arch i386 hello.o
./hello

hello.s:

代码语言:javascript
代码运行次数:0
运行
复制
/* defines */
.set sys_exit, 1
.set sys_write, 4
.set stdout, 1
.set kernel, 0x80

// TEXT SECTION
.text

/* write function */
.macro write str, strSize
    // length of string
    push \strSize
    // the string
    push \str
    // to file descriptor
    push $stdout
    // what we want to call
    movl $sys_write, %eax
    // call the kernal
    call _syscall
    // free the stack
    addl $12, %esp
.endm

/* define main function */
.globl start

/* impl. main function */
start:

    // write(string, long)
    // if I use $len i get a bunch of letters
    write $msg, $14 //$len

    // exit(0)
    // if i print out $len it is 14
    push $0 //$len
    movl $sys_exit, %eax
    call _syscall

/* call kernal 
 * 
 * so you don't have to do sub $4, %esp
 */
_syscall:
    int $kernel
    ret

// DATA SECTION
.data
    /* our string */
    msg: .string "Hello World!\n"
    // using len: .long $14 causes the same issue as . - msg
    // where the string does not end at 14
    // perhaps someone else knows why..
    len: .long . - msg

我希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12902220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档