【汇编入门】编写一个一位十进制数与两位十进制数的相加

  1. 题目要求

下面给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。要求实验者按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。

  1. 源码
;FILENAME:    EXA131.ASM
;.486
DATA SEGMENT    USE16
SUM     DB      ?,?,
MESG    DB      '25+9='
        DB      0,0
N1      DB      9, F0H
N2      DB      25 
DATA    ENDS
 
CODE    SEGMENT    USE16
        ASSUME CS:CODE,DS:DATA      
BEG:    MOV     AX,DATA             
        MOV     DS,AX
        MOV     BX,OFFSET SUM
        MOV     AH,N1
        MOV     AL,N2
        ADD     AH,AL
        MOV     [BX],AH 
        CALL    CHANG
        MOV     AH,9                
        MOV     DX,OFFSET MESG     
        INT     21H   
        MOV     AH,4CH
        INT     21H 
CHANG:   PROC
LAST:   CMP     [BX],10
        JC      NEXT
        SUB     [BX],10
        INC     [BX+7]
        JMP     LAST                
NEXT:   ADD     [BX+8],SUM        
        ADD     [BX+7],30H
        ADD     [BX+8],30H 
        RET
CHANG:   ENDP
 
CODE    ENDS
        END     BEG
  1. 代码
;FILENAME:    EXA131.ASM
;.486
DATA SEGMENT    USE16       ; DATA SEGMENT为段定义语句,段名为DATA,USE16单元有效地址为16位,16位寻址方式
SUM     DB      2 DUP(?)    ;变量名为SUM,定义2个字节变量
MESG    DB      '25+9='     ;变量名为MESG,定义字节变量
        DB      0,0,'$'
N1      DB      9           ;,F0H
N2      DB      25 
DATA    ENDS
 
CODE    SEGMENT    USE16
        ASSUME CS:CODE,DS:DATA      ;段约定语句,
BEG:    MOV     AX,DATA             ;设置DS初值
        MOV     DS,AX
        MOV     BX,OFFSET SUM       ;bx基址寄存器暂存SUM的相对于数据段DS的偏移地址
        MOV     AH,N1
        MOV     AL,N2
        ADD     AH,AL
        MOV     [BX],AH             ;25+9的和存入SUM
        CALL    CHANG
        MOV     AH,9                ;DOS功能调用09H号显示字符串
        MOV     DX,OFFSET MESG      ;入口参数DX=字符串首地址,字符串必须以‘$’为结束标志
        INT     21H   
        MOV     AH,4CH              ;返回DOS使用DOS系统的4CH功能调用
        INT     21H 
CHANG   PROC
LAST:   CMP     BYTE PTR [BX],10    ;[BX]基址寻址指向SUM,10立即数的类型属性不确定,需要PTR。即SUM和10比较,若SUM<10,则跳转到NEXT
        JC      NEXT
        SUB     BYTE PTR [BX],10    ;SUM>10则SUM=SUM-10
        INC     BYTE PTR [BX+7]     ;BX+7即输出的十位数加1
        JMP     LAST                ;JMP即JUMP无条转移
NEXT:   MOV     AH,SUM              ;不能直接在SUM和[BX+8]之间传值,需要中间一个AH寄存器
        ADD     [BX+8],AH           ; 定位到MESG DB 0,0的位置填入值,+8是后一个0
        ADD     BYTE PTR [BX+7]     ; 30H是0的ASCII
        ADD     BYTE PTR [BX+8],30H 
        RET
CHANG   ENDP
 
CODE    ENDS
        END     BEG
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值