程式的機器級表示——《深入理解計算機系統》
阿新 • • 發佈:2019-01-11
函式caller的彙編程式碼:
_caller:
pushl %ebp ;儲存基址指標
movl %esp, %ebp ;把基址指標設定為當前的棧頂(意味著call函式棧的開始)
subl $24, %esp ;分配24個位元組作為棧空間
movl $534, -12(%ebp) ;在距離基址12位元組處 作為引數arg1的空間(此間有8位元組的空檔)
movl $1057, -16(%ebp) ;在距離基址16位元組處 作為引數arg2的空間
leal -16(%ebp), %eax ;
movl %eax, 4(%esp) ;把引數2的地址值放到離棧頂指標的4位元組處
leal -12(%ebp), %eax
movl %eax, (%esp) ;把引數1的地址值放到棧頂指標處
call _swap_add ;呼叫函式swap_add(把當前程式正文地址壓棧,跳轉到函式swap_add地址處)
movl %eax, -8(%ebp) ;把返回值%eax放到距離基址8位元組處 作為引數sum的空間
movl -12(%ebp), %edx
movl -16(%ebp), %eax
movl %edx, %ecx
subl %eax, %ecx ;arg1 - arg2
movl %ecx, %eax
movl %eax, -4(%ebp) ;把arg1 - arg2的結果值放到距離基址4位元組處 作為引數diff的空間
movl -8(%ebp), %eax
imull -4(%ebp), %eax ;sum*diff
leave
ret
_caller:
pushl %ebp ;儲存基址指標
movl %esp, %ebp ;把基址指標設定為當前的棧頂(意味著call函式棧的開始)
subl $24, %esp ;分配24個位元組作為棧空間
movl $534, -12(%ebp) ;在距離基址12位元組處 作為引數arg1的空間(此間有8位元組的空檔)
movl $1057, -16(%ebp) ;在距離基址16位元組處 作為引數arg2的空間
leal -16(%ebp), %eax ;
movl %eax, 4(%esp) ;把引數2的地址值放到離棧頂指標的4位元組處
leal -12(%ebp), %eax
movl %eax, (%esp) ;把引數1的地址值放到棧頂指標處
call _swap_add ;呼叫函式swap_add(把當前程式正文地址壓棧,跳轉到函式swap_add地址處)
movl %eax, -8(%ebp) ;把返回值%eax放到距離基址8位元組處 作為引數sum的空間
movl -12(%ebp), %edx
movl -16(%ebp), %eax
movl %edx, %ecx
subl %eax, %ecx ;arg1 - arg2
movl %ecx, %eax
movl %eax, -4(%ebp) ;把arg1 - arg2的結果值放到距離基址4位元組處 作為引數diff的空間
movl -8(%ebp), %eax
imull -4(%ebp), %eax ;sum*diff
leave
ret