GAS (GNU Assembler)


macOS 에서는 as 컴파일러 사용.

macOS 에서는 clang에 포팜된 컴파일러가 사용된다


Hello, World! 출력 코드 작성


Reference : http://www.idryman.org/blog/2014/12/02/writing-64-bit-assembly-on-mac-os-x/


hello1.s 작성


.globl _main
.text

_main:
    mov $0x2000004, %rax
    mov $1, %rdi
    movabs $msg, %rsi
    mov $len, %rdx
    syscall
    ret

.data

msg:
    .ascii "Hello, World!\n"
    len = . - msg
 


64bit assembly 에서는 system call 방식이 int 0x80 에서 syscall 로 변경되었다.

또한 syscall 번호도 base 0x2000000 이 추가된다


syscall 번호 확인 : https://opensource.apple.com/source/xnu/xnu-4570.1.46/bsd/kern/syscalls.master.auto.html


4	AUE_NULL	ALL	{ user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); } 


rax 레지스터에 write syscall 인 4 + base 추가

rdi 레지스터에 stdout 인 1 추가 (fd)

rsi 레지스터에 "Hello, World!\n" 가 저장된 주소 추가 (cbuf)

rdx 레지스터에 길이 값 추가 (nbyte)


syscall 실행


ret 호출로 마무리

+ Recent posts