1、二进制双精度加法运算 计算 X+Y=Z,将结果 Z 存入某存储单元。
问题分析:该问题要求是双精度(2 个 16 位,即 32 位)加法运算,编程时可利用累加器 AX,先求低 16 位的和,并将运算结果存入低地址存储单元,然后求高 16 位的和,将结果存入高地址存储单 元中。由于低 16 运算后可能向高位产生进位,因此高 16 位运算时使用 ADC 指令,这样在低 16 位相加运算有进位时,高位相加会加上 CF 中的 1
在EMU8086系统下运行如下所示:其中一个非常值得注意的点就是不能直接把DATA移动到DS数据段寄存器当中,而是需要移动到AX寄存器当中,作为中转。另外记得合理利用CF标志位。
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
DATA SEGMENT
XH DW 0x0015
XL DW 0x65A0
YH DW 0x0021
YL DW 0xB79E
ZH DW 0x0037
ZL DW 0x1D3E
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,XL
ADD AX,YL
MOV ZL,AX
MOV AX,XH
ADC AX,YH
MOV ZH,AX
CODE ENDS
END START
该段代码在EMU8086的运行结果如图所示:
2. 十进制的 BCD 码减法运算 计算 X-Y=Z,其中 X、Y、Z 为 BCD 码。
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
DATA SEGMENT
X DW 0x0400
Y DW 0x0102
Z DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,00H
SAHF
MOV CX,0002H ;设定循环次数
MOV SI,OFFSET X
MOV DI,OFFSET Z
A1: MOV AL, [SI]
SBB AL, [SI+02H] ;执行X-Y
DAS ;减法调整当前AL寄存器中的值
PUSHF ;标志寄存器的值压栈
AND AL, 0FH ;清低四位
POPF ;从栈中探出数据,输入标志寄存器
MOV [DI], AL
INC DI
INC SI
LOOP A1
CODE ENDS
END START
运行结果为:
3. 乘法运算 实现十进制数的乘法运算,被乘数与乘数均以 BCD 码的形式存放在内存中,乘数为 1 位, 被乘数为 5 位,结果为 6 位。
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
DATA SEGMENT
DATA1 DB 5 DUP(0)
DATA2 DB ?
RESULT DB 6 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CALL INIT
MOV SI,OFFSET DATA2
MOV BL,[SI]
AND BL,0FH
CMP BL,09H ;相当于BL-09H,如果BF<9那么发生了借位,CF=1
JNC ERROR ;CF=0 时跳转到ERROR
MOV SI,OFFSET DATA1
MOV DI,OFFSET RESULT
MOV CX,0005H
A1: MOV AL, [SI+04H] ;从最低位开始处理,更有利于进位
AND AL, 0FH
CMP AL, 09H
JNC ERROR
DEC SI
MUL BL
AAM ;调整指令
ADD AL,[DI+05H]
AAA ;调整指令
MOV [DI+05H],AL
DEC DI
MOV [DI+05H],AH
LOOP A1
A2: MOV AX,4C00H
INT 21H
INIT: MOV SI,OFFSET RESULT ;若输入数据不符合要求则 RESULT 所指向内存单元全部写入 E
MOV CX,0003H
MOV AX,0000H
A3: MOV [SI],AX
INC SI
INC SI
LOOP A3
RET
ERROR: MOV SI,OFFSET RESULT
MOV CX,0003H
MOV AX,0EEEEH
A4: MOV [SI],AX
INC SI
INC SI
LOOP A4
JMP A2
CODE ENDS
END START