汇编作业(2006.5.2)

这篇博客展示了如何使用汇编语言从键盘读取一个十进制数X,然后根据不同的X值计算相应的Y值并以十六进制输出。程序包括多个条件判断分支,分别处理X为3、4、5、6的情况,最后显示结果。
摘要由CSDN通过智能技术生成

题目:从键盘上读入一个十进制数X,根据以下条件求Y,并以十六进制输出。

当X=3时,Y=X *X +X;  当X=4时,Y=X*X-2X; 当X=5时,Y=X*X; 当X=6时,Y=X*X/2

程序如下:

DATA SEGMENT
 X  DB  ?
 Y  DB  2 DUP(?), '$'
 STR1  DB  'PLEASE INPUT X:  $'
 STR2  DB  0AH, 0DH, 'THE RESULT IS: $'
 STR3  DB  0AH, 0DH, 'SORRY! YOU INPUT IS INVALID! $'
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  ; 获取输入(ASCII码形式存入AL)
 INT 21H
 
 CMP AL, 33H  ; 当输入==3时(ASCII码为33H时)跳转到CASE1
 JE CASE1

 CMP AL, 34H  ; 当输入==4时(ASCII码为34H时)跳转到CASE2
 JE CASE2
 
 JMP CONTINUE  ; 由于条件转移的距离只能为-128~+127个字节,所以此处设转移点


CASE1: AND AL, 0FH  ; 屏蔽AL高四位(把读入的ASCII码转变为数字)
 MOV X, AL
 MOV BL, X
 
 MUL BL   ; BL * AL 结果存入AX中
 ADD AL, X  ; 低四位加上X (此时低四位即为最终的16进制结果)
 
 MOV AH, AL  ; 令高8位等于低8位
 AND AH, 0F0H  ; 屏蔽AH的低四位(保留十位数字)
 MOV CL, 4  ; CL为右移位数
 SHR AH, CL  ; 逻辑右移4位,使得AH的低四位变为高四位,高四位置0
 AND AL, 0FH  ; 屏蔽AL低四位(保留个位数字)
 
 CMP AL, 0AH  ; 判断AL与0AH的关系
 JB CASE1_A  ; 如果AL < 0AH,则跳转到CASE_1A
 ADD AL, 07H  ; 否则将AL加上07H(转到字母所对应的ASCII码)

CASE1_A: MOV DI, OFFSET Y  ; 把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 CASE1_B   ; 如果AH < 0AH,则跳转到CASE_1B
  ADD AH, 07H   ; 否则将AH加上07H(转到字母所对应的ASCII码)

CASE1_B: ADD AH, 30H   ; 将AH加30H使数字对应上相应的ASCII码
  MOV [DI], AH   ; 把AH的值赋给DI当前所指向的地址
  JMP SHOW   ; 无条件跳到SHOW处


CASE2: AND AL, 0FH  ; CASE2过程与CASE1类似,注释略
 MOV X, AL
 MOV BL, X
 
 MUL BL
 SUB AL, X  ; 两次减去X(借位自动完成)
 SUB AL, X

 MOV AH, AL
 AND AH, 0F0H
 MOV CL, 4
 SHR AH, CL
 AND AL, 0FH

 CMP AL, 0AH
 JB CASE2_A
 ADD AL, 07H

CASE2_A: MOV DI, OFFSET Y
  ADD DI, 1
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
 
  CMP AH, 0AH
  JB CASE2_B
  ADD AH, 07H

CASE2_B: ADD AH, 30H
  MOV [DI], AH
  JMP SHOW 
  

CONTINUE: CMP AL, 35H  ; 当输入==5时(ASCII码为35H时)跳转到CASE3  
  JE CASE3  
 
  CMP AL, 36H  ; 当输入==6时(ASCII码为36H时)跳转到CASE4
  JE CASE4

  MOV DX, OFFSET STR3 ; 当输入无效时
  MOV AH, 09H
  INT 21H 
  JMP OVER


CASE3: AND AL, 0FH  ; 类似,注释略 
 MOV X, AL
 MOV BL, X
 
 MUL BL

 MOV AH, AL
 AND AH, 0F0H
 MOV CL, 4
 SHR AH, CL
 AND AL, 0FH

 CMP AL, 0AH
 JB CASE3_A
 ADD AL, 07H

CASE3_A: MOV DI, OFFSET Y
  ADD DI, 1
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
 
  CMP AH, 0AH
  JB CASE3_B
  ADD AH, 07H

CASE3_B: ADD AH, 30H
  MOV [DI], AH
  JMP SHOW

CASE4: AND AL, 0FH  
 MOV X, AL
 MOV BL, X
 
 MUL BL
 MOV BL, 2
 DIV BL   ; 商在AL中,余数在AH中(此处不考虑余数)

 MOV AH, AL
 AND AH, 0F0H
 MOV CL, 4
 SHR AH, CL
 AND AL, 0FH

 CMP AL, 0AH
 JB CASE4_A
 ADD AL, 07H

CASE4_A: MOV DI, OFFSET Y
  ADD DI, 1
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
 
  CMP AH, 0AH
  JB CASE4_B
  ADD AH, 07H

CASE4_B: ADD AH, 30H
  MOV [DI], AH
  JMP SHOW    

 


SHOW: MOV DX, OFFSET STR2 ; 显示提示字符串 
 MOV AH, 09H
 INT 21H

 MOV DX, OFFSET Y ; 显示结果
 MOV AH, 09H
 INT 21H
 MOV DL, 'H'  
 MOV AH, 02H
 INT 21H

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

CODE ENDS
END BEGIN
  

过了几天我再看的时候就有些问题了,感觉太繁琐了,应该定义一个子程序,调用就会简单许多了。算了,第一个汇编程序,就留作纪念好了
 

 

 
 
 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值