ポール・カーターによるPCアセンブリから80386を学んでいます
mul source
- オペランドがバイト サイズの場合、AL レジスタのバイトで乗算され、結果が AX の 16 ビットに格納されます。
大丈夫。
- ソースが 16 ビットの場合、AX のワードで乗算され、32 ビットの結果が DX:AX に格納されます。
Q1:なぜ DX:AX なのですか? EAX / EDXに保存できないのはなぜですか?
imul
本当に紛らわしい
imul dest, source1
imul dest, source1, source2
表の理解に問題があります。
Q2:表の 2 番目のエントリ。繰り返しますが、なぜ DX:AX なのか。なぜ EAX や EDX ではないのでしょうか?
次のコード スニペットを検討してください。
imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx
call print_int ; prints the int stored in eax
call print_nl ; prints new line
Q3:前に言ってたけどThe notation EDX:EAX means to think of the EDX and EAX registers as one 64 bit register with the upper
32 bits in EDX and the lower bits in EAX.
、答えもedxに保存されてるんだよね?上記のコードでは、EDX を考慮していません。単に EAX を参照しているだけです。これはまだどのように機能していますか?
Q4:テーブルの残りのすべてのエントリに問題があります。2 つの n ビット数 (n = 8/16/32 ビット) の最悪の場合の乗算結果は 2n ビットです。2 つの 16/32 ビット乗算の結果を格納すると、レジスタ自体が同じサイズになるのはなぜですか?