由於這本書介紹的是 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
沒有留言:
張貼留言