我试图在程序集中制作一个子程序,它将在屏幕上绘制一个正方形。我不认为我可以像在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意味着跳过一个完整的地址,无论它的长度是多少...)。 –