我寫了一個簡單的彙編程序:爲什麼在調用printf時覆蓋EDX的值?
section .data
str_out db "%d ",10,0
section .text
extern printf
extern exit
global main
main:
MOV EDX, ESP
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
CALL exit
我是NASM彙編器和對象文件鏈接到一個可執行Linux上的GCC。
本質上,該程序首先將堆棧指針的值放入寄存器EDX,然後打印該寄存器的內容兩次。但是,在第二次printf調用之後,打印到stdout的值與第一個不匹配。
這種行爲看起來很奇怪。當我用EBX替換該程序中EDX的每個用法時,輸出的整數與預期相同。我只能推斷在printf函數調用期間的某個時刻EDX被覆蓋。
爲什麼會出現這種情況?我如何確保將來使用的寄存器不會與C庫函數衝突?
那也是幾年前的第一次。你接受的答案是正確的,但省略'ebp'和'esp'作爲被調用者保存。這兩個人似乎不言而喻,但你可以從技術上解決這個問題。歡迎大會! – sqykly
@sqykly謝謝。這當然比我習慣的高級語言寬鬆得多。但我不會被它擊敗! :) – Jake
回答儘可能多的javascript問題,你會開始懷疑。 – sqykly