最近我一直在嘗試制作自己的作業系統。為此,我需要學習組裝。進展順利,但我偶然發現了一個問題:我可以將哪些暫存器用于函式引數?這是一個好習慣嗎?
uj5u.com熱心網友回復:
對于 16 位,您可以模仿 DOS。
函式編號進入 AH,其余引數進入任何其他暫存器,包括用于遠指標的 DS 和 ES 段暫存器。
暫存器不按任何順序選擇,而是根據它們將包含的內容進行選擇:
bx Handle
cx Count
ds:dx Far pointer
es:bx Far pointer
...
結果在任何合適的暫存器中傳遞,但主要在 AX 中連同指示成功與否的進位標志一起傳遞。
uj5u.com熱心網友回復:
我可以將哪些暫存器用于函式引數?這是一個好習慣嗎?
唯一的要求是呼叫者以被呼叫者期望的方式傳遞引數,而被呼叫者以呼叫者期望的方式回傳引數。對于組裝,每個例程都可以做任何對自己方便的事情,并且只需使用一些注釋就可以輕松跟蹤,例如:
; Routine to juggle the wobbly things
;
;Input
; ax First thing
; bx Second thing
;
;Output
; cx First result
; dx Second result
;
;Trashed
; ax, bx, bp
juggleTheWobblies:
請注意,對于 80x86,某些指令具有隱含的暫存器 ( mul, div, xlat, loop, stosd, in, ...),這使得確定傳遞引數的最佳方式變得容易(以避免將內容從錯誤的暫存器移動到指令所需的暫存器中)。
僅當您的工具(編譯器、聯結器)無法正確優化時,才需要特定的 ABI(例如“第一個引數進入該暫存器,第二個引數進入該暫存器,..”)。這主要發生在您進行動態鏈接或沒有鏈接時間代碼生成的靜態鏈接時。對于幾乎所有其他情況,編譯器可以執行與匯編相同的操作(以對于根本沒有 ABI 的特定函式而言似乎最佳的方式傳遞引數)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527624.html
標籤:部件x86-16调用约定
