8086汇编语言-运算类

EMU8086汇编语言示例:双精度加法、BCD码运算及乘法实现,

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值