我正试图用GNU汇编程序为Mac编写Hello,但在它打印"Hello“之前,它是总线错误。
.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
追踪:
$ 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代替。
我做错了什么?
规格:
发布于 2012-10-15 22:20:50
因为你做错了什么,我不确定。我已经有一段时间没有使用程序集了,但是clang不喜欢我的mac上的.equ状态。当我换掉它们的时候,它运行得很好。(老实说,我更喜欢NASM,尽管我使用的是macport的。)
我创建了一个简单的.s文件,该文件将使用clang编译,字符串长度有一个问题。(也许是个窃听器?)我将长度存储在$len中,但是当我使用$len时,它不起作用。但用硬编码的数字就行了。
我用以下方法编译了代码:
clang -c -o hello.o hello.s -arch i386
ld -o hello -macosx_version_min 10.6 -arch i386 hello.o
./hello
hello.s:
/* 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
我希望这能帮到你。
https://stackoverflow.com/questions/12902220
复制相似问题