回覆列表
  • 1 # 使用者7364316064609

    (1) 引數個數少於7個:

    f (a, b, c, d, e, f);

    a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9

    g (a, b)

    a->%rdi, b->%rsi

    有趣的是, 實際上將引數放入暫存器的語句是從右到左處理引數表的, 這點與32位的時候一致.

    CODE

    2) 引數個數大於 7 個的時候

    H(a, b, c, d, e, f, g);

    a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%rax

    g->8(%esp)

    f->(%esp)

    call H

    易失暫存器:

    %rax, %rcx, %rdx, %rsi, %rdi, %r8, %r9 為易失暫存器, 被呼叫者不必恢復它們的值。

    顯然,這裡出現的暫存器大多用於引數傳遞了, 值被改掉也無妨。而 %rax, %rdx 常用於

    數值計算, %rcx 常用於迴圈計數,它們的值是經常改變的。其它的暫存器為非易失的,也

    就是 rbp, rbx, rsp, r10~r15 的值如果在彙編模組中被改變了,在退出該模組時,必須將

    其恢復。

    教訓:

    用匯編寫模組, 然後與 c 整合, 一定要搞清楚編譯器的行為, 特別是引數傳遞的方式. 此外, 我現在比較擔心的一點是, 將來如果要把程式移植 到 WIN/VC 環境怎麼辦? 以前我用cygwin的gcc來處理彙編模組, 用vc來處理c模組, 只需要很少改動. 現在的問題是, 如果VC用 不同的引數傳遞方式, 那我不就麻煩了?

  • 中秋節和大豐收的關聯?
  • 形容抑鬱的詩句?