东北大学计算机硬件基础知识分支程序设计实验报告Word文档下载推荐.docx
《东北大学计算机硬件基础知识分支程序设计实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《东北大学计算机硬件基础知识分支程序设计实验报告Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
MOVCL,[SI+2]
CMPAL,BL
JAENEXT1
XCHGAL,BL;
排序,将最大数送AL寄存器
NEXT1:
CMPAL,CL
JAENEXT2
XCHGAL,CL
NEXT2:
CMPBL,CL;
将最小数送CL寄存器
JAENEXT3
XCHGBL,CL
NEXT3:
MOV[SI],AL;
从大到小依次存回缓冲区
MOV[SI+1],BL
MOV[SI+2],CL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.执行emulate程序,对源程序进行调试,生成originalsourcecode和emulator:
noname.exe_文件,结果无错误。
3.执行run程序,打开程序aux,选择memory,查看地址0710:
0000,经验证运行结果为340E0D,即521413,由大到小排列,满足题目要求且无错误。
五、实验结果
1.执行emulate程序,对源程序进行调试,生成originalsourcecode和emulator:
noname.exe_文件,得到如下界面:
2.执行run程序,打开程序aux,选择memory,查看地址0710:
0000,得到如下界面:
运行结果为340E0D,即521413,由大到小排列,满足题目要求且无错误。
六、思考题
分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确的地使用条件转移指令。
本程序中,由于是无符号数的比较,所以也可以根据一个标志位来判定数的大小,你能说出那个是标志位吗,且程序中的JEA指令改用什么指令替换呢?
答:
可以根据CF标志位来判定数的大小。
CF=0时,DST>
SRC;
当CF=1时,DST<
RSC。
当CF=1时,用JC指令可以实现转移;
当CF=0时,用JNC指令可以实现转移。
七、扩展题
在BUF开始的单元里有3个单字节无符号数,编写程序找出它们中的最小值并存入MIN单元。
1.输入源程序如下:
DSEGSEGMENT
BUFDB99,72,88
MINDB0
DSEGENDS
CODESEGMENT
ASSUMECS:
CSEG,DS,DSEG
MOVAX,DSEG
MOVDS,AX
MOVSI,OFFSETBUF
MOVAL,[SI];
MOVBL,[SI+1]
MOVCL,[SI+2]
CMPAL,BL;
JAENEXT1
XCHGAL,BL
MOVMIN,BL;
排序,将最小数送MIN区
CMPBL,CL
JAENEXT2
XCHGBL,CL
MOVMIN,CL
MOVAH,4CH
INT21H
ENDSTART
0000,结果如下图。
经验证运行结果为63485848,即997288,MIN区值为48,即最小值72,无错误。
八、实验心得
通过此次试验我理解了汇编语言中编程的基本步骤,掌握了分支结构程序设计中准确知道操作结果影响的标志位状态和正确的使用无条件转移指令以及无符号数的比较方法。
这个实验,使我认识到直接通过CPU寄存器地址赋值可以大大提高效率,并且让我知道要继续练习熟读汇编语言代码的功能及用法。
实验二
(1)x、y异号
DATASEGMENT
XDB99
YDB-33
ZDB0
DATAENDS
ASSUMECS:
MOVDS,AX
CMPX,0;
x与0进行比较
JLL1;
x<
0转L1
CMPY,0
JLL2;
y<
0转L2
MOVZ,1;
x>
=0,y>
=0则1→Z,无条件转EXIT
JMPEXIT
L1:
CMPY,0;
y>
=0转L2
JGEL2
MOVZ,-1;
0,y<
0则-1→Z,无条件EXIT
JMPEXIT
L2:
MOVZ,0;
x,y异号则0→Z
EXIT:
MOVAH,4CH
INT21H
ENDSTART
0000,经验证当x、y异号时,Z值为0,结果满足题目要求且无错误。
(2)x、y同为正
XDB13
YDB14
ENDSTART
0000,经验证当x、y都大于0时,Z值为1,结果满足题目要求且无错误。
(3)x、y同为负
XDB-36
YDB-12
0000,经验证当x、y都小于0时,Z值为-1,结果符合题目要求且无错误。
经验证当x、y异号时,Z值为0,结果满足题目要求且无错误。
经验证当x、y都大于0时,Z值为1,结果满足题目要求且无错误。
x、y都小于0时,Z值为-1,结果符合题目要求且无错误。
本程序中判定符号用的是CMP指令,而用逻辑操作指令也可以。
比如,可以用AND指令,使其进行自身与操作,反映到SF标志位,还可以用TEST指令直接测试最高位,并将结果反映到ZF标志位,然后根据ZF标志位判断。
试用TEST指令编之。
1.输入源程序如下:
XDB66
YDB-100
ZDB0
ASSUMECS:
MOVAX,DATA
MOVDS,AX
TESTX,80H
JNEL1
TESTY,80H
JNEL2
MOVZ,1
JMPEXIT
L1:
TESTY,80H
JEL2
MOVZ,-1
MOVZ,0
MOVAH,4CH
INT21H
0000,结果如下图
经验证运行结果为429C00,即66-1000,x、y异号,Z值为0,无错误。
如果不采用上述方法判断两数的符号,而采用两数异或的方法判断两数的符号,当两数的符号不相同时,其结果的最高位必定为1;
当两数的符号相同时,其结果的最高位必定为0;
在根据其中一数的符号是正还是负决定两数是正数还是负数。
请做程序完成。
(1)x、y同号
XDB-3
YDB-4
ZDB0
CSEGSEGMENT
CSEG,DS:
DSEG
MOVDS,AX
MOVAL,X
MOVBL,Y
XORAL,BL
JSL1
JGEL2
MOVZ,1
JMPEXIT
MOVZ,1
JMPEXIT
MOVZ,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
(2)x、y异号
XDB5
YDB-6
JSL1
JEL2
通过此次试验我理解了汇编语言中编程的基本步骤,掌握了emu8086软件的基本运用,调试,对运行结果的简单分析。
能运用基本的汇编语言做一些简单的程序,尤其是对CMP指令,逻辑指令TEST和他对应的ZF指令的熟悉与运用。
实验三
1.输入源程序
DIS0DB'
INPUTDIGIT0!
$'
DIS1DB'
INPUTDIGIT1!
DIS2DB'
INPUTDIGIT2!
DIS3DB'
INPUTDIGIT3!
DIS4DB'
INPUTDIGIT4!
DIS5DB'
INPUTDIGIT5!
DIS6DB'
INPUTDIGIT6!
DIS7DB'
INPUTDIGIT7!
DIS8DB'
INPUTDIGIT8!
DIS9DB'
INPUTDIGIT9!
DIS10DB'
INPUTCHARACTER!
MOVAX,DATA
MOVAH,1;
调用键盘输入DOS中断
INT21H
CMPAL,30H;
如果输入的是非数字则转M
JBM
CMPAL,39H
JAM
ANDAL,0FH
JMPN:
如果输入的是数字则转N,AL寄存器保存输入的数
M:
MOVAL,10;
如果输入的是非数字则将AL寄存器送10
N:
LEABX,TAB;
根据AL寄存器的值求转移地址表的地址
MOVAH,0
SHLAL,1
ADDBX,AX
JMPBX;
转到地址表中对应的指令去执行
MOVAH,4CH
TAB:
JMPSHORTP0;
地址表
JMPSHORTP1
JMPSHORTP2
JMPSHORTP3
JMPSHORTP4
JMPSHORTP5
JMPSHORTP6
JMPSHORTP7
JMPSHORTP8
JMPSHORTP9
JMPSHORTP10
P0:
LEADX,DIS0;
显示输入字符INPUTDIGIT0!
MOVAH,9
JMPEXIT
P1:
LEADX,DIS1;
显示输入字符INPUTDIGIT1!
P2:
LEADX,DIS2;
显示输入字符INPUTDIGIT2!
P3:
LEADX,DIS3;
显示输入字符INPUTDIGIT3!
P4:
LEADX,DIS4;
显示输入字符INPUTDIGIT4!
P5:
LEADX,DIS5;
显示输入字符INPUTDIGIT5!
P6:
LEADX,DIS6;
显示输入字符INPUTDIGIT6!
P7:
LEADX,DIS7;
显示输入字符INPUTDIGIT7!
P8:
LEADX,DIS8;
显示输入字符INPUTDIGIT8!
P9:
LEADX,DIS9;
显示输入字符INPUTDIGIT9!
P10:
LEADX,DIS10;
显示输入字符INPUTCHARACTER!
0000,结果无错误。
经验证,输入数字0~9时,显示INPUTDIGIT0!
~INPUTDIGIT9!
;
输入其他键时,显示INPUTCHARACTER!
,结果符合题意且正确。
2.执行run程序,分别输入数字:
“5”和字母“T”,得到如下界面:
经验证,运行结果无错误且符合题意。
再求相应地址是,程序中使用了SHLAL,1语句,请问这说明了什么?
答:
“SHLAL,1"
的命令是指将操作数乘以2,在该程序中,转移指令表中的每条转移指令代码是由两个字节组成的,将AL寄存器中的数乘以2后再与BX相加,就是对应输入数字的转移指令代码的有效地址。
编制程序,判断键盘输入的一个数,若输入1—5,则将该数转换为二进制数存放至RLT单元,若输入其他数则显示输出“ERROR”。
DISDB'
ERROR!
$'
RLTDW0
MOVAH,1
CMPAL,31H
JBM
CMPAL,35H
JAM
ANDAL,0FH
JMPN
LEADX,DIS
MOVAH,9
INT21H
JMPEXIT
LEABX,TAB
MOVAH,0
DECAL
SHLAL,1
ADDBX,AX
JMPBX
JMPSHORTP0
JMPSHORTP1
JMPSHORTP2
JMPSHORTP3
JMPSHORTP4
MOVRLT,0001H
JMPEXIT
MOVRLT,0010H
MOVRLT,0011H
MOVRLT,0100H
JMP