アセンブリ(NASM)を学び始めたので、2つの数値を除算する方法を知りたいと思いました(たとえば、Windowsの場合)。
私のコードはこのように見えますが、クラッシュします。
global _main
extern _printf
section .text
_main:
mov eax, 250
mov ebx, 25
div ebx
Push ebx
Push message
call _printf
add esp , 8
ret
message db "Value is = %d", 10 , 0
本当に何が悪いのかしら?除算後の値も表示されません。
あなたの指示div ebx
レジスタペアを分割しますedx:eax
(これはこの命令の暗黙のオペランドです)提供されたソースオペランド(つまり、除数)。
mov edx, 0
mov eax, 250
mov ecx, 25
div ecx
上記のコードではedx:eax
は配当であり、ecx
は除数です。 )。 div
命令を実行した後、レジスタeax
には商が含まれ、edx
にはremainder。
コメントに記載 のように、レジスタecx
を保持する必要があるため、除数を保持するためにebx
の代わりにレジスタebx
を使用しています。呼び出しの合間に。それ以外の場合は、変更する前に適切に保存し、返す前に復元する必要があります対応するサブルーチンから。
1つのコメントに記載 のように、商が商レジスタ(この場合はeax
)の範囲内に収まらない場合、で除算します。ゼロエラーは発生します。
これは、プログラムがクラッシュする理由を説明している可能性があります。レジスタedx
はdiv
命令を実行する前に設定されていないため、値が大きすぎて結果の商が適合しない可能性があります。 eax
レジスタ内。