Assembler Programming for Intel and PPC on OSX
Intel x86
On Intel macs, you need to push arguments for the syscall function onto the stack. On PPC, you use registers starting with r3 to pass arguments to syscall. Other differences are the comments: on Intel, you use a pound sign, and on PPC, you use a semi-colon. The instruction order on the Intel version uses AT&T style syntax rather than the Intel syntax (more a kin to the PPC version below).
# Hello World x86 asm - MacOS X
# By Erik Wrenholt
# gcc hello.s -o hello ; ./hello ; echo $?
# References:
# http://forums.osxfaq.com/viewtopic.php?t=13976
# http://www.zathras.de/angelweb/blog-intel-assembler-on-mac-os-x.htm
hello:
.ascii "Hello World!\n"
len = . - hello
.text
.globl _main
_syscall:
int $0x80 # call syscall
ret
_main:
pushl $len # pass the length of the string
pushl $hello # pass the ptr to the hello string
pushl $1 # pass stdout (1)
movl $0x4, %eax # SYS_write (4)
call _syscall
add $12, %esp # clear stack (we pushed 3 args)
pushl $0 # we want to call exit(0), push 0
movl $1, %eax # SYS_exit=1
call _syscall
leave
ret
PowerPC
; Hello World PPC asm - MacOS X
; By Erik Wrenholt
; gcc hello.s -o hello ; ./hello ; echo $?
; References:
; http://www-128.ibm.com/developerworks/library/l-ppc/
; http://www.ultraviolent.com/ppc/demos/asm/hello/
.data
msg:
.asciz "Hello World!\n"
len = . - msg
.text
.globl _main
_main:
li r0,4 ; SYS_write = 4
li r3,1 ; stdout = 1
lis r4,hi16(msg) ; push address of msg
addi r4,r4,lo16(msg) ; push address of msg
li r5,len ; push len
sc ; syscall
nop ; skipped if syscall was successful
li r0,1 ; SYS_exit = 1
li r3,0 ; exit(0)
sc ; syscall
nop ; skipped if syscall was successful
blr ; return
Comments
Leave a Comment
Show Comment Form
|