函數調用與堆棧清理

來源:互聯網
上載者:User
今天看了一會《Professional Assembly Language》,在P104函數調用的地方,看到了一些好東東,摘抄如下:
(如果你不瞭解函數調用與堆棧清理的基礎概念,詳見:http://www.turbozv.com/read.php?78 ,趕快補補)

首先是一個函數的模版,它自己(被呼叫者)清理堆棧(這個就是__stdcall了):function_label:
    pushl %ebp
    movl %esp, %ebp
    # your code goes here
    movl %ebp, %esp
    popl %ebp
    ret

還用注意call function_label的時候首先將%eip入棧,然後ret的時候恢複saved %eip => %eip。

如果是調用C的庫函數,例如:printf(),那就要調用方清理堆棧了(__cdecl):.section .data
output:
    .asciz "This is section %d\n"

.section .text

    pushl $1
    pushl $output
    call printf
    add $8, %esp # clear up stack

順便補2個常見的Asm操作:
【1】為auto變數分配空間:
直接操作%esp就可以了,例如:subl $24, %esp #分配24個位元組。
訪問局部變數的時候,直接使用%ebp+位移就可以了。
【2】地址對齊:
andl $-16, %esp #按16地址對齊。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.