アセンブラで "mul"オペランドを使用するロジックを理解しようとしています(Visual Studio CommunityとMASMを使用しています)。 なぜ、 "mul ebx"の後に結果がedxでもなく、eaxだけでなく変化していますか? "結果(MULの)は、レジスタAX、レジスタ対DX:AX、またはレジスタ対EDX:EAX(オペランドサイズに依存)に格納され、レジスタAH、DX、またはEDX」である。 位置はオペランドのサイズによって異なりますか?その場合は?mulを使ったedx :: eaxとレジスタのメモリ割り当て
.586
.model flat,c
.stack 100h
.data
.code
doit proc
;EAX = 0062EEF0 EBX = 7EFDE000 ECX = 0029FD00 EDX = 00000000
mov eax,8;
;EAX = 00000008
mov ebx,4
;EBX = 00000004
mov edx,23498
;EDX = 00005BCA
mul ebx
;EAX = 00000020 EDX = 00000000 ???? 4*8 =20(hexa).So, there is no
;overflow;why is edx changing too?
doit endp
end
目的地が異なる理由は、2つの8ビットオペランドが16ビットの結果を必要とし、16ビットのレジスタAXが16ビットであり、16ビット×16ビットが結果として32ビットを必要とするため、DXの32ビット:AX、32ビットx 32ビットは結果のために64ビットを必要とし、EDXの64ビットをergoします:EAX – infixed
['mul r/m8'](http://www.felixcloutier.com/x86/MUL) .html)をAH:ALに出力します。しかし、結果の上位半分を必要としない場合は、[IMUL](http://www.felixcloutier.com/x86/IMUL)の2オペランドまたは3オペランド直接形式を使用することができます。 html)。 –
オーバーフローの概念がないためEDXが変更されました。これらのビットは、0のゼロを行った場合でも結果の一部です。 – infixed