简单的装配数学

时间:2017-01-09 01:52:48

标签: assembly x86

您好我正在尝试学习汇编程序x86。 我想SUB字和字节。
我有

MOV al, a
MUL a

MOV ax, 3
MUL b

我该怎么做?感谢。

1 个答案:

答案 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交换相同。

从dword

中减去单词

我们假设没有32位寄存器可用。

结果是dword

将减法分成两个(高和低)部分,并使用低部分的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

结果是一个单词

对于双字案例,可以简单地转换字字节大小写的结果。

从单词

中减去dword

上述结果与minuend和subtrahend交换相同。