今天我打得四處彙編代碼遞增函數指針創建備用入口點函數:在C中有沒有類似於這個彙編代碼的操作?
.386
.MODEL FLAT, C
.DATA
INCLUDELIB MSVCRT
EXTRN puts:PROC
HLO DB "Hello!", 0
WLD DB "World!", 0
.CODE
dentry PROC
push offset HLO
call puts
add esp, 4
push offset WLD
call puts
add esp, 4
ret
dentry ENDP
main PROC
lea edx, offset dentry
call edx
lea edx, offset dentry
add edx, 13
call edx
ret
main ENDP
END
(我知道,在技術上該代碼是無效的,因爲它調用puts
沒有CRT被初始化,但它工作時沒有任何彙編或運行時錯誤,至少在MSVC 2010 SP1上)。
請注意,在第二次調用dentry
時,我如前所述將edx
寄存器中的函數地址與之前一樣,但是這次我增加了它在調用函數之前由13個字節組成。
該程序的輸出因此是:
C:\Temp>dblentry
Hello!
World!
World!
C:\Temp>
的「Hello!\nWorld!
」第一輸出是從調用該函數的一開始,而第二輸出是從呼叫開始於「 push offset WLD
「指令。
我想知道這樣的事情是否存在於從C,Pascal或FORTRAN等彙編語言升級而來的語言中。我知道C不會讓你增加函數指針,但有沒有其他方法來實現這種事情?
看到它一般不會因爲跳繩函數序言會導致各種問題的工作。在更高級的語言中(甚至在這個問題上),你應該把它分成兩個獨立的函數,一個調用另一個函數,讓編譯器選擇最好的實現。 – Jester
我相信較早的FORTRAN支持多個入口點的功能,並且快速的谷歌搜索產生https://gcc.gnu.org/onlinedocs/gcc-3.4.4/g77/Alternate-Entry-Points.html和https:/ /docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn99/index.html – ninjalj
實際的問題是**爲什麼**你想要這樣做?這是一個維護噩夢。如果直到優化:> 99%的程序不需要這個。其餘的東西通常可以通過編譯器進行優化,並且比這種70/80的BASIC黑客更好的結構。 – Olaf