汇编作业(2006.5.19)

DATA SEGMENT
 X DB 5, ?, 5 DUP(0)
 XX DW 0    ; 将X完成拼接操作存入XX (将XX当作要被转换的数据处理)
 Y DB 5 DUP(0)   ; 存转换后的10进制数
 STR1 DB 'INPUT 4 DIGITS: $'
 STR2 DB 0AH, 0DH, 'THE BCD CODE IS: $'  ; 实际打印出来的是BCD码表示的10进制数
 STR3 DB 0AH, 0DH, 'INPUT ERROR! TRY AGAIN! $'
DATA ENDS

STACK SEGMENT PARA STACK
 DW 20H DUP(0)
STACK ENDS

CODE SEGMENT
 ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: MOV AX, DATA
 MOV DS, AX
 MOV DX, OFFSET STR1
 MOV AH, 09H
 INT 21H
 MOV DX, OFFSET X
 MOV AH, 0AH
 INT 21H
 MOV DI, OFFSET X
 INC DI
 MOV BL, [DI]
 CMP BL, 4   ; 检测输入是否为4位
 JE NEXT
 JMP ERROR
NEXT: INC DI
 PUSH DI
 CALL TES   ; 检测输入有效性并转化ASCII为数字
 POP DI
 CALL CHANGE   ; 将X按位拼接到XX中,使之成为长度为一个字的16进制数
 MOV DX, XX
 MOV DI, OFFSET Y
 MOV CX, 0H   ; 存放10进制数的位数
LOP2: MOV AX, DX   ; 被除数放入AX
 MOV DX, 0H  
 MOV BX, 10
 DIV BX    ; 除以10,余数在DX中,商在AX中
 XCHG AX, DX   ; 交换余数和商的位置
 ADD AL, 30H   ; 把余数转化为ASCII码
 MOV [DI], AL   ; 存余数
 INC DI
 INC CX    ; 位数计数器加1
 CMP DX, 0H    ; 如果商为0,则输出
 JNZ LOP2
 
 MOV DX, OFFSET STR2
 MOV AH, 09H
 INT 21H
LOP3: DEC DI    ; CX(10进制数的位数)控制此循环
 MOV DL, [DI]   ; 依次输出
 MOV AH, 02H
 INT 21H
 LOOP LOP3
 MOV DL, 'D'
 INT 21H
 JMP OVER

ERROR: MOV DX, OFFSET STR3
 MOV AH, 09H
 INT 21H
 
OVER: MOV AH, 4CH
 INT 21H
 
TES PROC    ; 检测与转换输入的子程序
 MOV CX, 4
LOP0:  MOV AX, 0
  MOV AL, [DI]      ; 判断输入的不同情况
  CMP AL, '0'
  JB ERROR
 CMP AL, 'f'
  JA ERROR
  CMP AL, '9'
  JBE PART1 
 CMP AL, 'A'
  JB ERROR
  CMP AL, 'F'
  JBE PART2
  CMP AL, 'a'
  JB ERROR
  CMP AL, 'f'
  JBE PART2

PART1:  AND AL, 0FH      ; 开始转化为数值
  MOV [DI], AL      ; 替换原始ASCII码
  JMP CONTINUE1 
PART2:  SUB AL, 07H
  JMP PART1

CONTINUE1:  INC DI
  LOOP LOP0
 RET
TES ENDP

CHANGE PROC
 MOV BX, 0
 MOV CX, 3   ; 总共移位3次,或运算拼接4次
LOP1: PUSH CX
 OR BL, [DI]   
 MOV CL, 4
 SHL BX, CL   ; 左移4个2进制位(1个16进制位)
 INC DI
 POP CX
 LOOP LOP1
 OR BL, [DI]   ; 多进行或运算一次
 
QUIT: MOV XX, BX   ; 拼接完成存入BX
 RET
CHANGE ENDP

CODE ENDS
END BEGIN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值