2018年9月19日 星期三

x86 assembly in Linux - part 1

目前看的書是網路很推薦的 "Programming from the Ground Up"
由於這本書介紹的是 32 位元的組語寫法
故在編譯成 64 位元的 code 時會有問題

此時需指定 --32 to as and -m elf_i386 to ld

as source.s --32 -o source.o
ld source.o -m elf_i386 -o source.out

另外,如果在 call function 時,想把 label's address pass to function
在 label 前面,需加上 "$"

底下是個 example,max function 會幫忙把資料組裡的最大值找出
並將回傳值放進 %eax register

.section .data
list:
    .long 31,2,199,7,0

.section .text

.global _start

_start:

    pushl $list
    call max
    addl $4, %esp

    movl %eax, %ebx
    movl $1, %eax
    int $0x80

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

    movl 8(%ebp), %ebx

    movl $0, %edi

    movl $4, %edx
    imull %edi, %edx
    addl %ebx, %edx
    movl (%edx), %eax

start_loop:
    incl %edi

    movl $4, %edx
    imull %edi, %edx
    addl %ebx, %edx
    movl (%edx), %ecx

    cmpl $0, %ecx
    je end_loop

    cmpl %eax, %ecx
    jle start_loop

    movl %ecx, %eax
    jmp start_loop

end_loop:
    movl %ebp, %esp
    popl %ebp
    ret

沒有留言:

張貼留言