web-dev-qa-db-ja.com

NASMでの2つの数値の除算

アセンブリ(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

本当に何が悪いのかしら?除算後の値も表示されません。

6
Karen

あなたの指示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)の範囲内に収まらない場合、で除算します。ゼロエラーは発生します。

これは、プログラムがクラッシュする理由を説明している可能性があります。レジスタedxdiv命令を実行する前に設定されていないため、値が大きすぎて結果の商が適合しない可能性があります。 eaxレジスタ内。

6
眠りネロク