汇编语言分支结构

这里不自己介绍命题了,直接把实验的要求贴上:

一、实验目的: 掌握组织及调试一个简单并完整的汇编语言程序,熟悉汇编语言上机过程。  

二、实验内容: 已知两个整数变量 A 和 B,试编写完成下述操作的程序: 

(1)、若两个数中有一个是奇数,则将奇数存入 A 中,偶数存入 B 中。 

(2)、若两个数均为奇数,则两数分别加 1,并存回原变量。 

(3)、若两个数均为偶数,则两变量不变。  

三、实验步骤: 

(1)、分析所要解决的问题,确定适当的算法。本实验中需考虑如何确定一 个整数的奇偶。 

(2)、设计整个程序的逻辑结构,画出程序流程图。如下所示: 

(3)、编写程序,正确运用符号指令、伪操作以及 DOS、BIOS 功能调用, 并写出清晰的注释。  

(4)、上机调试运行程序。 

************************************************************************************

    ​首先,定义变量(包括题目中的A,B和必要的输出字符串):

A DB ?
B DB ?
STRINGA DB  'A=','$'
STRINGB DB  13,10,'B=','$'
STRINGC DB  13,10,'$'


    ​分析流程图有:当A和B都是奇数时A和B都加1,A为偶数B为奇数时AB交换,其他情况不变。考虑到用户交互,我们这里在之前与之后都试着输出提示信息与输入AB。

LEA  DX,STRINGA
MOV  AH,9
INT  21H
 
MOV AH,01
MOV AL,0
INT 21H
MOV A,AL


    ​首先提示用户输入A,调用中断类型是21H,9号命令;用户输入时,调用21H中断的1号命令,从命令行读取一个字符,这里解释一下,题目中要求A和B是实数类型,但是这里却保存A和B为字符类型,为什么呢?读者可以在书本或者网上找到ASCII码,看到实数整形变量与字符差了30H,但并不影响判断奇偶性,并且这里笔者也偷了个懒,仅仅实现了流程图中的功能,但是在实际运行的时候就会发现仅支持输入一个字符类型的,嘛……嘛…………,这个不是重点………………,这里还是实现了图中的功能的。

    再者就是输入B了,代码一样的,下面我们讲输入之后的逻辑,笔者用的TEST与JZ的组合,如下:

TEST A,01H
JZ FLAGA

    ​TEST命令对A和01H做了与操作,根据TEST命令的特点,这里并不影响A的值,仅改变标志位,这是为后面A和B的加一操作和输出考虑的,整个的逻辑结构和流程图一致,代码如下:

    TEST A,01H
    JZ FLAGA
    TEST B,01H
    JZ FLAGB
    ADD A,1
    ADD B,1
    JMP FLAGB
     
FLAGA:
    TEST B,01H
    JZ FLAGB
    MOV AL,A
    MOV AH,B
    MOV B,AL
    MOV A,AH
     
FLAGB:
    LEA DX,STRINGC
    MOV AH,9
    INT 21H
    SUB DX,DX


    ​后面的一系列操作就是把A和B输出了,调用的命令也是中断21H中的,读者可以查阅21H的中断命令表:

LEA DX,STRINGA
MOV AH,9
INT 21H
 
MOV DL,A
MOV AH,02
INT 21H
SUB DX,DX
SUB DL,DL
 
LEA  DX,STRINGB
MOV  AH,9
INT  21H
 
MOV DL,B
MOV AH,02
INT 21H


整体的代码如下:

DATAS SEGMENT
    A DB ?
    B DB ?
    STRINGA DB  'A=','$'
    STRINGB DB  13,10,'B=','$'
    STRINGC DB  13,10,'$'
DATAS ENDS
 
STACKS SEGMENT
STACKS ENDS
 
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
     
    LEA  DX,STRINGA
    MOV  AH,9
    INT  21H
     
    MOV AH,01
    MOV AL,0
    INT 21H
    MOV A,AL
     
    LEA  DX,STRINGB
    MOV  AH,9
    INT  21H
     
    MOV AH,01
    MOV AL,0
    INT 21H
    MOV B,AL
     
    TEST A,01H
    JZ FLAGA
    TEST B,01H
    JZ FLAGB
    ADD A,1
    ADD B,1
    JMP FLAGB
     
FLAGA:
    TEST B,01H
    JZ FLAGB
    MOV AL,A
    MOV AH,B
    MOV B,AL
    MOV A,AH
     
FLAGB:
    LEA DX,STRINGC
    MOV AH,9
    INT 21H
    SUB DX,DX
     
    LEA DX,STRINGA
    MOV AH,9
    INT 21H
     
    MOV DL,A
    MOV AH,02
    INT 21H
    SUB DX,DX
    SUB DL,DL
     
    LEA  DX,STRINGB
    MOV  AH,9
    INT  21H
     
    MOV DL,B
    MOV AH,02
    INT 21H
     
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


运行结果如图:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值