您好我正在尝试学习汇编程序x86。
我想SUB字和字节。
我有
MOV al, a
MUL a
和
MOV ax, 3
MUL b
我该怎么做?感谢。
答案 0 :(得分:0)
扩展字节并进行单词减法。
零扩展(对于无符号的减数)
;AX = minuend WORD, BL = subtrahend BYTE
movzx bx, bl ;BX = 16-bit zero extension of BL
sub ax, bx ;AX = 16-bit result
或
;AX = minuend WORD, BL = subtrahend BYTE
xor bh, bh ;BX = 16-bit zero extension of BL
sub ax, bx ;AX = 16-bit result
符号扩展(用于已签名的减数)
;AX = minuend WORD, BL = subtrahend BYTE
movsx bx, bl ;BX = 16-bit sign extension of BL
sub ax, bx ;AX = 16-bit result
或
;AX = minuend WORD, BL = subtrahend BYTE
mov bh, bl
sar bh, 7 ;BX = 16-bit zero extension of BL
sub ax, bx ;AX = 16-bit result
或
;BX = minuend WORD, AL = subtrahend byte
;Note BX and AX swapped role
cbw ;AX = 16-bit sign extension of AL
sub bx, ax ;BX = 16-bit result
如果减数字值适合一个字节(无符号为[0-255],有符号为[-128,127]),则将该字缩小为一个字节并进行字节字节减法。
<强>收缩强>
;AL = minuend BYTE, BX = subtrahend WORD
;Ignore high (zero) byte of subtrahend
sub al, bl ;AL = 8-bit result
如果减数字值不适合一个字节(无符号为[0-255],有符号为[-128,127]),则将该字缩放为一个字节并执行一个字节 - 字节减法。
<强>缩放强>
;AL = minuend BYTE, BX = subtrahend WORD
;Scale WORD by using the high byte
sub al, bh ;AL = 8-bit result
上述结果与minuend和subtrahend交换相同。
我们假设没有32位寄存器可用。
将减法分成两个(高和低)部分,并使用低部分的CF. 在十进制中,1234 - 99 = 1135可以分为24-99和12-00(借用其他减法)
<子> 1 子> <子> 12 子> <子> 1 子>
3 4
9个9
----
3 5
<子> 1 子>
1个2
0 0
----
1 1
在汇编中,通过sbb
零扩展拆分减法(对于无符号减数)
;DX:AX = minued DWORD, BX = subtrahend WORD
sub ax, bx ;Low part
sbb dx, 0 ;High part
签名扩展拆分减法(用于签名减数)
;DX:AX = minued DWORD, BX = subtrahend WORD
mov cx, bx
sar cx, 15 ;CX = Sign extension of BX
sub ax, bx ;Low part
sbb dx, cx ;High part
或
;CX:BX = minued DWORD, AX = subtrahend WORD
;NOTE that the input registers are different
cwd ;Sign extend AX into DWORD DX:AX
sub bx, ax ;Low part
sbb cx, dx ;High part
对于双字案例,可以简单地转换字字节大小写的结果。
上述结果与minuend和subtrahend交换相同。