这里不自己介绍命题了,直接把实验的要求贴上:
一、实验目的: 掌握组织及调试一个简单并完整的汇编语言程序,熟悉汇编语言上机过程。
二、实验内容: 已知两个整数变量 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
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
运行结果如图: