汇编作业(2006.5.3)

题目:从键盘读入两个一位十六进制数,根据条件,以十六进制输出计算结果

A:计算X+Y   B:计算|X-Y|   C:计算X*Y  D:计算X/Y

源程序:

DATA SEGMENT
 X DB ?
 Y DB ?
 Z DB 2 DUP(0), '$'
 LIST DB '0123456789ABCDEF', '$'  ; 检测输入是否为有效数字的存储列表
 STR1 DB 'INPUT X: $'
 STR2 DB 0AH, 0DH, 'INPUT Y: $'
 STR3 DB 0AH, 0DH, 'CHOOSE [A], [B], [C] OR [D]: $'
 STR4 DB 0AH, 0DH, 'ERROR! YOUR INPUT IS INVALID!$'
 STR5 DB 0AH, 0DH, 'THE RESULT IS: $'
DATA ENDS

CODE SEGMENT
 ASSUME CS:CODE, DS:DATA

BEGIN: MOV AX, DATA
 MOV DS, AX
 
 MOV DX, OFFSET STR1  ; 提示信息
 MOV AH, 09H
 INT 21H

 MOV AH, 01H
 INT 21H

 MOV DI, OFFSET LIST  ; 取出LIST的偏移量
 MOV BL, 46H   ; 令BL为46H(字符F的ASCII码值)

LOP1: CMP AL, [DI]   ; 将读入的字符与存储列表逐个比较
 JE NEXT1   ; 若有效,则跳转
 CMP [DI], BL   ; 已经比较至F(列表尾部),即输入的是无效字符
 JE ERROR1   ; 跳转至错误信息
 INC DI    ; DI加1,指向列表中下一个字符
 LOOP LOP1    ; 新一轮循环

ERROR1: MOV DX, OFFSET STR4  ; 错误信息
 MOV AH, 09H
 INT 21H
 JMP OVER

NEXT1: CMP AL, 39H   ; 比较输入的字符是否为0~9
 JA NEXT2   ; 若为A~F则跳转
 AND AL, 0FH   ; 否则屏蔽高4位(将ASCII码还原成数字)
 MOV X, AL   
 JMP NEXT3   ; 跳转

NEXT2: SUB AL, 07H   ; 输入为A~F,则将读入的ASCII码减去7
 AND AL, 0FH   ; 屏蔽高4位(将对应的ASCII码还原成字母)
 MOV X, AL   ; X值获取结束,存入变量
 
NEXT3: MOV DX, OFFSET STR2  ; 以下为获取Y的值,与上面获取X的步骤相同
 MOV AH, 09H
 INT 21H

 MOV AH, 01H
 INT 21H
 
 MOV DI, OFFSET LIST  
 MOV BL, 46H   

LOP2: CMP AL, [DI]
 JE NEXT4
 CMP [DI], BL
 JE ERROR2
 INC DI
 LOOP LOP2

ERROR2: MOV DX, OFFSET STR4
 MOV AH, 09H
 INT 21H
 JMP OVER

NEXT4: CMP AL, 39H
 JA NEXT5
 AND AL, 0FH
 MOV Y, AL
 JMP NEXT6

NEXT5: SUB AL, 07H
 AND AL, 0FH
 MOV Y, AL   ; Y值获取结束,存入变量

NEXT6: MOV DX, OFFSET STR3  ; 提示信息
 MOV AH, 09H
 INT 21H

 MOV AH, 01H
 INT 21H
 
 CMP AL, 41H   ; 若输入为41H(字符A的ASCII码值)
 JE CASE1   ; 则跳转
 
 CMP AL, 42H   ; 若输入为42H(字符B的ASCII码值)
 JE CASE2   ; 则跳转

 CMP AL, 43H   ; 若输入为43H(字符C的ASCII码值)
 JE CASE3   ; 则跳转
 
 CMP AL, 44H   ; 若输入为44H(字符D的ASCII码值)
 JE CASE4   ; 则跳转
 
ERROR3: MOV DX, OFFSET STR4  ; 否则,显示错误信息
 MOV AH, 09H
 INT 21H
 JMP OVER

CASE1: MOV AL, X   ; 二者相加
 ADD AL, Y
 JMP CAL    ; 跳至CAL处进行处理

CASE2: MOV AL, X   ; 二者相减的绝对值
 CMP AL, Y   ; 比较X,Y的大小
 JB CASE2_A   ; 若X < Y,则跳转
 SUB AL, Y   ; 否则用X减Y
 JMP CAL    ; 跳至处理部分

CASE2_A: MOV X, AL  ; 此时X < Y
  MOV AL, Y  
  SUB AL, X  ; 用Y减X
  JMP CAL   ; 跳转

CASE3: MOV AL, X   ; 二者相乘
 MOV BL, Y
 MUL BL
 JMP CAL    ; 跳转

CASE4: AND AH, 00H   ; 首先屏蔽AH部分,避免干扰
 MOV AL, X   
 MOV BL, Y
 DIV BL    ; X除以Y,商在AL中,余数在AH中
 JMP SPECIAL   ; 由于其特殊性,不能直接跳至CAL处
 

CAL: MOV AH, AL  ; 令高8位等于低8位
 AND AH, 0F0H  ; 屏蔽AH的低四位(保留十位数字)
 MOV CL, 4  ; CL为右移位数
 SHR AH, CL  ; 逻辑右移4位,使得AH的低四位变为高四位,高四位置0
 AND AL, 0FH  ; 屏蔽AL低四位(保留个位数字)
 
SPECIAL: CMP AL, 0AH  ; 判断AL与0AH的关系
  JB CASEA  ; 如果AL < 0AH,则跳转到CASE_1A
  ADD AL, 07H  ; 否则将AL加上07H(转到字母所对应的ASCII码)

CASEA:  MOV DI, OFFSET Z  ; 把Y的偏移量赋给DI
  ADD DI, 1   ; DI加1,指向Y的高地址部分(Y有两个字节)
  ADD AL, 30H   ; 将AL加30H使数字对应上相应的ASCII码
  MOV [DI], AL   ; 把AL的值赋给DI所指向的地址
  DEC DI    ; DI减1(向低地址移动1个字节)

  CMP AH, 0AH   ; 判断AH与0AH的关系
  JB CASEB   ; 如果AH < 0AH,则跳转到CASE_1B
  ADD AH, 07H   ; 否则将AH加上07H(转到字母所对应的ASCII码)

CASEB:  ADD AH, 30H   ; 将AH加30H使数字对应上相应的ASCII码
  MOV [DI], AH   ; 把AH的值赋给DI当前所指向的地址

SHOW: MOV DX, OFFSET STR5  ; 显示提示信息和结果
 MOV AH, 09H
 INT 21H
 MOV DX, OFFSET Z
 MOV AH, 09H
 INT 21H
 MOV DL, 'H'  
 MOV AH, 02H
 INT 21H

OVER: MOV AH, 4CH   ; 中止
 INT 21H

CODE ENDS
END BEGIN 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值