アセンブリで、画面上に正方形を描画するサブプログラムを作成しようとしています。私はC++で行うのと同じように、サブプログラムにパラメータを渡すことはできないと思うので、スタックを使用してパラメータを格納してアクセスすることができました(共通データレジスタを使用できません。パス)。x86アセンブリ:スタックを介して関数にパラメータを渡す
問題は、現在の「プログラム」のアドレスにcallコマンドを使用するとスタックに保存されるため、「ret」コマンドを使用したときにどこの場所を知るかという問題です復帰する。しかし、スタックに何かを格納してから関数を呼び出すと、スタックの最上部にあるアドレスのどこかに保存してから、パラメータを安全にポップする必要があります。その後、コードが終了し、 "ret"を呼び出す前に、私は住所を押し戻す必要があります。
私は正しいですか?そして、もしそうなら、どこにアドレスを格納することができますか(私はアドレスがAXやBXあるいは他のデータレジスタに収まるように1バイト長ではないと思います)。これを行うために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? (私が知っているのは、例えば、varや他のものを指している次のアドレスを意味しているということです) –
実際には..2は2バイトを意味しますか?バイト単位の長さであれば、アドレス全体にジャンプするということです。 –