我試圖在程序集中製作一個子程序,它將在屏幕上繪製一個正方形。我不認爲我可以像在C++中那樣將參數傳遞給子程序,所以我認爲我可以使用堆棧來存儲和訪問參數(我不能使用公共數據寄存器,因爲變量太多通過)。x86程序集:通過堆棧將參數傳遞給函數
問題是(我記得在某處讀到),當我使用call命令將當前「程序」的地址保存在堆棧中時,這樣當它使用「ret」命令時,它會知道在哪裏回來。但是,如果我在堆棧中存儲了一些東西,然後調用該函數,我將不得不在地址的某個地方(即堆棧頂部)保存,然後安全地彈出這些參數。然後在代碼完成之後,在調用「ret」之前,我將不得不推回該地址。
我對不對?如果是的話,我可以在哪裏存儲地址(我不認爲該地址只有1個字節長,以便它適合AX或BX或任何其他數據寄存器)。我可以使用IP來做到這一點(雖然我知道這是用於其他)?
這是我想象:
[BITS 16]
....
main:
mov ax,100b
push ax
call rectangle ;??--pushes on the stack the current address?
jml $
rectangle:
pop ax ;??--this is the addres of main right(where the call was made)?
pop bx ;??--this is the real 100b, right?
....
push ax
ret ;-uses the address saved in stack
是不是BP已經在子程序中使用了,因爲我不知道什麼地址? '16位BP寄存器主要幫助引用傳遞給子程序的參數變量。 SS寄存器中的地址與BP中的偏移量組合以獲取參數的位置。 BP還可以與DI和SI結合作爲特殊尋址的基址寄存器。' (來自http://www.tutorialspoint.com/assembly_programming/assembly_registers.htm) –
爲什麼[BP + 6]?我知道[]在引用地址時使用。如果BP是子例程的地址(我猜),那麼[BP + 6]將指向子例程右邊的命令? (我有點新,所以我可能是錯的..)。爲什麼6? (我知道+1意味着例如下一個可以指向var或其他地址的地址) –
因此..2實際上意味着2個字節是正確的?......跳過2個字節不是整個地址(I到+1意味着跳過一個完整的地址,無論它的長度是多少...)。 –