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