(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用 不同的引數傳遞方式, 那我不就麻煩了?
(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用 不同的引數傳遞方式, 那我不就麻煩了?