汇编语言分支结构程序设计

汇编语言分支结构程序设计

从基础知识到现在,应该掌握一些基本的汇编语言,下面是两道例题简单介绍、梳理一下汇编分支结构程序代码:

1、内存自BUF单元开始的缓冲区连续存放着10个学生的英文分数,编程序统计其中90~100,60~89,60以下者各有多少人?并把90-100分人数结果存放在P1单元中、60-89分人数结果存放在P2单元中,60分以下人数结果存放在P3单元中(P1、P2、P3为数据段的单元),最后把P1、P2、P3中的数以”P1=?、P2=?、P3=?”显示在屏幕上。(注:数据以10进制显示)

程序代码:

DATA SEGMENT
BUF  DB     70H,58H,50H,91H,99H,62H,75H,82H,74H,60H ;定义BUF单元地址开始的缓冲区的数据
ORG  0020H   ;程序执行时,将P1送到0200H内存单元  
P1 DB 0
ORG  0030H    ;程序执行时,将P2送到0300H内存单元  
P2  DB  0
ORG  0040H 
P3  DB 0          ;程序执行时,将P3送到0400H内存单元  
ORG  0050H   ;程序执行时,将DP1送到0500H内存单元  
DP1  DB 'P1= $'
ORG  0060H   ;程序执行时,将DP2送到0600H内存单元   
DP2  DB 'P2= $'
ORG  0070H   ;程序执行时,将DP3送到0700H内存单元  
DP3  DB 'P3= $' 
ORG  0080H   ;程序执行时,将COUNT送到0800H内存单元  
COUNT   DW     10   ;'$'为地址运算符,返回当前程序语句的地址偏移值
DATA ENDS  ;定义数据段
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA   
PUSH DS  ;将DS压入堆栈     
SUB AX,AX;将AX内存器内容清空     
PUSH AX
START:
MOV    AX,DATA     
MOV   DS,AX ;将数据传给数据段DS     
MOV   CX,COUNT ;设置计数器CX,最多为10     
MOV   SI,0     ;给SI赋值为0
LP1:     
MOV AL,BUF[SI] ;将BUF内存单元的第si个内容赋值给AL     
CMP AL,90H     ;判断该学生的分数是否>=90     
JNB  LP2        ;若不低于90则跳转到LP2     
CMP  AL,60H    ;判断该学生的分数是否>=60     
JC    LP3       ;若产生进位则跳转到LP3     
INC  P2        ;将分数在60-89的学生的分数个数存放到P2中     
JMP   LP5       ;跳转到LP5,即循环遍历数组BUF
LP3: 
INC  P3        ;将P3中的个数+1     
JMP   LP5       ;跳转到LP5
LP2: 
INC  P1        ;给P1中的个数+1
LP5: 
INC  SI        ;将SI进行+1操作,即下一个成绩分数     
LOOP  LP1       ;循环LP1     
LEA  DX,DP1          
MOV AH,09H    
INT  21H    
MOV DL,P1     
ADD DL,30H     ;转对应的ASCII值     
MOV AH,2     
INT  21H        ;将P1数据转10进制输出
LEA 
DX,DP2     
MOV AH,09H     
INT  21H     
MOV DL,P2     
ADD DL,30H     ;转对应的ASCII值     
MOV AH,2     
INT  21H        ;将P2数据转10进制输出     
LEA DX,DP3     
MOV AH,09H     
INT  21H     
MOV DL,P3     
ADD DL,30H     ;转对应的ASCII值     
MOV AH,2     
INT  21H     
MOV   AH,4CH     
INT    21H      ;将P3数据转10进制输出
CSEG ENDS     
END   START

运行结果:
运行结果
BUF开始的内存单元的10个数中有2个>=90,6个在60-89,2个在60以下
验证正确

2.已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。

程序代码:

DATAS SEGMENT
    DATAX DB 9H
    DATAY DB 2H
    RLT DB 1 DUP(?)   
;此处输入数据段代码  
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:   
MOV AX,DATAS   
MOV DS,AX     ;将DATAS中的数据存入DS   
MOV BL,DATAX  ;将DATAX送入BL   
MOV BH,DATAY  ;将DATAY送入BH   
MOV AH,01H   
int 21H       ;DOS功能调用,等待键盘输入一个值     
CMP AL,'+'   
JE addition   ;若输入符号为'+',则跳转到addition   
CMP AL,'-'   
JE subtraction;若输入符号为'-',则跳转到subtraction   
CMP AL,'*'   
JE multiplication;若输入符号为'*',则跳转到multiplication   
CMP AL,'/'   
JE division   ;若输入符号为'/',则跳转到division
addition:   
ADD BL,BH     ;将BL,BH内容相加   
JMP print     ;跳转到输出过程   
subtraction:   
SUB BL,BH     ;将BL,BH内容相减   
JMP print 
multiplication:   
MOV AL,BH   
MUL BL        ;将BL,BH内容相乘   
MOV BL,AL   
JMP print   
division:   
MOV AL,BL   
SUB AH,AH   
DIV BH        ;将BL,BH内容相除   
MOV BL,AL   
JMP print   
print:   
MOV AL,BL   
MOV CL,4   
SHR AL,CL     ;将AL数据逻辑右移4位   
ADD AL,30H    ;将AL数据转为对应ASCII值   
CMP AL,39H    ;比较AL中数据与39H的大小   
JBE look1        ;当AL<=39H时,跳转到look1   
ADD AL,07H    ;>=39H,则只加07H
look1:   
MOV DL,AL   
MOV RLT,AL   
MOV AH,02H   
INT 21H   
MOV AL,BL   
AND AL,0FH   
ADD AL,30H   
CMP AL,39H   
JBE look2   
ADD AL,07H
look2:   
MOV DL,AL   
MOV RLT,AL   
MOV AH,02H   ;dos功能调用,输出DL   
INT 21H   
;此处输入代码段代码   
MOV AH,4CH   
INT 21H
CODES ENDS   
END START

运行结果:
加:
加法
减:
减法
乘:
乘法
除:
除法
人工验算结果为正确的。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值