汇编语言之实现32位加减乘操作
基础知识
- 在做加法的时候,以补码运算,以无符号数是否进位决定CF是否为1,以有符号数运算结果是否合理决定OF是否为0。对于到底是有符号数还是无符号数,取决于如何理解内存中的二进制数据。
- 在用16位实现32位双精度加法时,DX,AX组成一组,BX,CX组成一组,低位用ADD,高位用ADC,得出结果。
- INC不考虑CF位。
- CBW默认将AL寄存器的值拓展到AX,正数补0,负数补F。
- CWD默认将AX寄存器的值拓展到DX,AX,DX为高位,AX为低位,正负数填补情况同上。
实验内容
利用16位汇编指令实现32位的加减乘操作,并且说明在执行过程中各个标志位的变化以及变化的原因。
加法操作
程序说明
- 首先读入第一个数据 -9CH,并拓展成双字
- 将其的高位和低位分别移动到BX,CX后,读入第二个数据,并且执行拓展为双字的操作
- 之后用ADD指令将其低位字相加,用ADC将其高位字相加
- 执行完ADD AX,CX后可以看到,SF标志位由PL变为NG,原因是 -9CH + 4DH 的运算结果为负数,所以符号寄存器SF便有PL(正数)变为NG(负数)。
- 执行完ADC DX,BS后,所要观察的标志位没有发生变化,原因是进行FFFFH和0000H的相加,并没有溢出进位等改变。
程序代码
DATAS SEGMENT
A dw -100; FFFFFFFF9C
B dw 77 ; 4D
V dw 11 ; B
D dw 9 ; 9
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
; ADD
MOV AX,A
CWD
MOV CX,AX
MOV DX,BX
MOV AX,B
CWD
ADD AX,CX
ADC DX,BX
MOV AH,4CH
INT 21H
CODES ENDS
END START
减法操作
程序说明
- 读入一个操作数 -9CH 并且拓展为双字
- 读入第二个操作数 F9H,并且拓展为双字
- 执行减法操作
- 对低位用SUB指令,在执行完SUB AX,CX后,发现CF标志位由NC变为了CY,即进位由无变为了有,原因是在进行减法的时候,相当于是 -9C-F9H,对应十进制的-100-255,最高位发生了借位操作。
- 对高位用SBB指令,在执行完SBB
DX,BX后,发现ZF由NZ变为ZR,原因是0000与FFFF做减法运算结果非0。
程序代码
DATAS SEGMENT
A dw -100; FFFFFFFF9C
B dw 255 ; FF
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
; SUB
MOV AX,A
CWD
MOV CX,AX
MOV BX,DX
MOV AX,B
CWD
SUB AX,CX
SBB DX,BX
MOV AH,4CH
INT 21H
CODES ENDS
END START
乘法操作
程序说明
- 读入两个数据的低位,并做乘法运算。发现在执行完 MUL DX后,发现CF标志位由NC变为CY,OF由NV变为OV,原因是1234H 与1234H相乘后结果溢出,且有进位。
- 读入第一个数字的高位和第二个数字的低位,做乘法。在执行完乘法后发现,OF标志位由OV变成NV,而CF标志位由CY变为NC,说明 此次乘法没有溢出,也没有进位,16位运算可以放得下。
- 读入第一个数字的低位和第二个数字的高位,做乘法运算。做完乘法运算后发现,ZF寄存器由ZR变为了NZ,表示运算结果非0。而CF和OV标志寄存器未发生改变,说明运算没有进位和溢出。
- 读入第一个数的高位和第二个数的高位,做乘法运算。执行完乘法后发现,ZF标志位由ZR变为NZ,说明运算结果非零。
程序代码
DATAS SEGMENT
XH DW 0001H ;x1
XL DW 1234H ;x2
YH DW 0002H ;y1
YL DW 1234H ;y2
TEMP DW 4 DUP (?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
; MUL
MOV AX,XL
MOV DX,YL
MUL DX
MOV [TEMP],DX
MOV [TEMP+2],DX
MOV AX,XH
MOV DX,YL
MUL DX
ADD [TEMP+2],AX
ADC [TEMP+4],DX
MOV AX,XL
MOV DX,YH
MUL DX
ADD [TEMP+2],AX
ADC [TEMP+4],DX
ADC [TEMP+6],0
MOV AX,XH
MOV DX,YH
MUL DX
ADD [TEMP+4],AX
ADC [TEMP+6],DX
MOV AH,4CH
INT 21H
CODES ENDS
END START