正如你可能已經猜到的問題是gcc
自動保存被調用保存寄存器還是應該自己做?我認爲gcc
會爲我做的,但是當我gcc a.c && objdump -d a.out
後寫了這個代碼確實gcc保存被調用者保存寄存器
void foo(void) {
__asm__ volatile ("mov $123, %rbx");
}
void main(void) {
foo();
}
我看到這個
00000000004004f6 <foo>:
4004f6: 55 push %rbp
4004f7: 48 89 e5 mov %rsp,%rbp
4004fa: 48 c7 c3 7b 00 00 00 mov $0x7b,%rbx
400501: 90 nop
400502: 5d pop %rbp
400503: c3 retq
0000000000400504 <main>:
400504: 55 push %rbp
400505: 48 89 e5 mov %rsp,%rbp
400508: e8 e9 ff ff ff callq 4004f6 <foo>
40050d: 90 nop
40050e: 5d pop %rbp
40050f: c3 retq
據ABI x86-64的是%rbx
被叫保存登記,但在這代碼gcc
在修改之前未將其保存在foo
中。僅僅是因爲我在調用foo()
之後沒有在主要功能中使用%rbx
,或者因爲gcc
不提供這樣的服務,我必須在修改之前自己將其保存在foo
之前?
GCC不關注你的內聯asm,它只是逐字地發佈它。這取決於你做正確的事情。 –
這將是非常糟糕的代碼,通過死記硬背保存和恢復每個寄存器。 –
@WeatherVane所以這意味着'gcc'不會預先保存這個寄存器,我應該自己保存它們嗎? – PepeHands