2018年9月20日 星期四

x86 assembly in Linux - part 4

在高階語言的世界裡 printf 就像喝水一樣
往往是最常用的 debug 工具之一

但在組語的世界裡
在還不會呼叫 C 語言函式庫前
你是無法跟螢幕打交道的

幸好我們還是可以透過 system call 來做這件事
用的是 write system call
差別在 file descriptor 是 STDOUT ($1)

底下是個包裝好的函式
接收 1 個參數,指向 C語言字串 (null-terminated string) 的 address 位址
參數傳遞方式是使用 stack

.type myprint,@function
myprint:
    pushl %ebp
    movl %esp, %ebp

    # get msg address
    movl 8(%ebp), %ecx

    # get msg length
    movl $0, %edx

start_loop:
    cmpb $0, (%ecx)
    je end_loop

    incl %ecx
    incl %edx

    jmp start_loop

end_loop:
    movl $4, %eax
    movl $1, %ebx
    movl 8(%ebp), %ecx
    int $0x80

    movl %ebp, %esp
    popl %ebp
    ret

沒有留言:

張貼留言