压缩BCD码的减法运算????

ni_ch 2001-10-29 11:03:18
希望知道得发到我的邮箱里。
ni_ch@sina.com
对于发来的每一个都有分给,每个都给100分
...全文
453 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tarzan710 2001-10-30
  • 打赏
  • 举报
回复
组合型BCD码(即压缩的BCD码)减法调整指令为DAS(Decimal Adjust for Subtraction),在执行这条指令之前,必须首先执行SUB或SBB等减法指令,且相减结果已经存入在AL寄存器中。它执行的操作是:
(AL)<-把AL寄存器中的差值调整为组合型BCD码格式
其执行过程如下:
(1)如果AL寄存器的低4位在A-F之间或标志寄存器的AF位为1,则AL寄存器的内容减6,并将标志寄存器的AF位置1;
(2)如果AL寄存器的高4位在A-F之间或标志寄存器的CF位为1,则AL寄存器的内容减6,并将标志寄存器的CF位置1。

下面是一个程序段说明如何实现组合型BCD码的减法。
设被减数524,减数861,SUB1指向524的首位,SUB2指向861的首位。则SUB1指向的字节存放的是5,SUB1+1指向的是字节存放的是24,SUB2同理。在相减过程中如果被减数小于减数,则运算结果为“-”,此时就必须用SUB2-SUB1才能得到正确结果,我们只须要交换SI和DI即可。

LEA SI,SUB1+1    ;设置被减数指针
LEA DI,SUB2+1    ;设置减数指针
MOV AH,‘+’    ;预置相减数结果符号“+”
MOV BX,0
MOV CX,2     ;两数均用2个字节存放操作数,所以要相减2次,就是要循环2次

LOP1:MOV AL,SUB1[BX]
SUB AL,SUB2[BX]
JE NEXT1
JNC NEXT2     ;SUB1>SUB2,转移
MOV AH,'-'     ;SUB1<SUB2,修改结果符号“-”
XCHG SI,DI     ;减数与被减数交换
JMP NEXT2

NEXT1: INC BX    ;改变已处理位数
LOOP LOP1   ;

NEXT2: MOV RESULT,AH  ;符号放入结果首址
LEA BX,RESULT+2 ;取存放结果末址
MOV CX,2
CLC

LOP2: MOV AL,[SI]   ;两数相减
SBB AL,[DI]
DAS          ;十进制调整
LAHF         ;暂存向高位的进位
OR AL,30H     ;转换成ASCII码
MOV [BX],AL     ;保存结果
SAHF
DEC SI
DEC DI
DEC BX
LOOP LOP2
tarzan710 2001-10-30
  • 打赏
  • 举报
回复
不好意思,上面有一点点错误。
OR  AL,30H
这句转换成ASCII码只能是对非压缩的BCD码才行,对于一个字节存放两个BCD码则不行。
可以分别对一个字节的高四位和低四位求ASCII。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧