汇编语言程序设计实验篇emu8086Word格式文档下载.docx
《汇编语言程序设计实验篇emu8086Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验篇emu8086Word格式文档下载.docx(42页珍藏版)》请在冰豆网上搜索。
在“emulator”对话框中,选择“view”菜单中的“memory”菜单项,也可以观察存的情况。
在“RandomAccessMemory”对话框中,可以修改文本框中的值可以确定所要观察的地址,该值由段基地址:
段偏移地址构成,如图所示,当前要观察的存地址为(6000:
0010)。
在显示结果中,左边是逻辑地址,中间是从该地址的开始连续16个字节的容,右边是每个字节对应的字符。
在该对话框中,也可以直接修改存储器单元的值,如图所示,从60010H开始的连续4个字节的容已经被修改为12H,34H,56H和78H。
1.2基础实验
1.2.1数据传送指令
1.实验目的
1)熟悉8086指令系统的数据传送指令及8086的寻址方式。
2)利用emu8086调试工具调试汇编程序。
2.实验设备
微型计算机、emu8086
3.实验原理
通用数据传送指令包括:
1)通用数据传送指令,如MOV,PUSH,POP,XCHG,CBW,CWD;
2)目标地址传送指令,如LDS,LES;
3)标志传送指令,如LAHF,SAHF,PUSHF,POPF;
4)输入输出指令,如IN,OUT,LEA
寻址方式包括:
1)立即寻址;
2)直接寻址;
3)寄存器寻址;
4)寄存器间接寻值;
5)寄存器相对寻址;
6)基址-变址寻址;
7)基址—变址—相对寻址;
8)隐含寻址
4.实验容
(1)创建TEMPLATE程序,输入以下程序段,观察程序的执行情况,程序段如下:
MOVBL,08H;
BX=?
MOVCL,BL;
CL=?
MOVAX,03FFH;
AX=?
MOVBX,AX;
MOVDS:
[6000H],BX;
DS:
[6000H]=?
(提示:
在emulator对话框中间的文本框中输入段基地址:
段偏移地址,可以观察其它逻辑段相应存储单元的容)
(2)创建TEMPLATE程序,用以下程序段将一组数据压入PUSH堆栈区,然后通过三种不同方式出栈。
观察栈的变化情况(提示:
在emulator对话框中,单击
按钮可以察看栈中容)以及出栈后数据的变化情况,并把结果填入表11中。
程序段如下:
MOVAX,0102H
MOVBX,0304H
MOVCX,0506H
MOVDX,0708H
PUSHAX
PUSHBX
PUSHCX
PUSHDX
第—种出栈方式的指令序列:
POPDX
POPCX
POPBX
POPAX
第二种出栈方式的指令序列(注:
替换掉第—种出栈方式的指令序列):
第三种出栈方式的指令序列(注:
替换掉第二种出栈方式的指令序列):
表11数据传送实验结果表格
寄存器的值
第一种出栈方式
第二种出栈方式
第三种出栈方式
(AX)=
(BX)=
(CX)=
(DX)=
(3)创建TEMPLATE程序,分别输入下列指令,按要求设置各寄存器及存单元的值(提示:
在“emulator”对话框中,可以直接修改寄存器的值;
选择“view”菜单中的“memory”菜单项可以设置存单元的值),其中BX=0010H,SI=0001H,[60010H]=12H,[60011H]=34H,[60012H]=56H,[60013H]=78H,[60120H]=0ABH,[60121H]=0CDH,[60122H]=0EFH,观察指令执行后AX中的容。
1)MOVAX,1200H
2)MOVAX,BX
3)MOVAX,[0120H]
4)MOVAX,[BX]
5)MOVAX,0110H[BX]
6)MOVAX,[BX][SI]
7)MOVAX,0110H[BX][SI]
(4)创建TEMPLATE程序,试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,将DS:
6000H字节存储单元中的容传送到DS:
6020H单元中。
(5)设AX=1111H,BX=2222H,[DS:
6010H]=3333H。
试编写TEMPLATE程序,将AX的容与BX的容交换,然后再将BX的容与DS:
6010H单元的容进行交换。
(6)若[DS:
6000H]=0EEFFH,[ES:
7000H]=0CCDDH,请编写TEMPLATE程序,将两个存储单元的容交换。
5.实验习题
指出下列指令的错误并加以改正,并在emu8086中验证。
1)MOV[BX],[SI]
2)MOVAH,BX
3)MOVAX,[SI][DI]
4)MOVBYTEPTR[BX],2000H
5)MOVCS,AX
6)MOVDS,2000H
6.实验报告要求
1)整理源程序段和运行结果。
2)给出几种在emu8086中察看存单元的方法。
1.2.2算术逻辑运算指令
1)熟悉算术逻辑运算指令的功能。
2)了解标志寄存器中各标志位的意义以及指令执行对它的影响。
算术运算指令包括:
1)加法指令,如ADD,ADC,INC;
2)减法指令,如SUB,SBB,DEC,NEG,CMP;
3)乘法指令,如MUL,IMUL;
4)除法指令,如DIV,IDIV。
逻辑运算指令包括:
AND,OR,NOT,XOR,TEST
(1)创建TEMPLATE程序,输入以下程序段,单步执行并记录标志位的变化情况(提示:
按钮察看标志寄存器的值)。
程序段及结果表格如表12。
表12算术逻辑运算实验结果表格
标志位
程序
CF
ZF
SF
OF
PF
AF
程序段1
MOVAX,1018H
MOVSI,230AH
ADDAX,SI
ADDAL,30H
MOVBX,3FFH
ADDAX,BX
MOV[20H],1000H
ADD[20H],AX
程序段2
MOVAX,0A0AH
ADDAX,0FFFFH
MOVCX,0FF00H
ADCAX,CX
SUBAX,AX
INCAX
ORCX,0FFH
ANDCX,0F0FH
MOV[10H],CX
程序段3
MOVBL,25H
MOVBYTEPTR[10H],4
MOVAL,[10H]
MULBL
程序段4
MOVWORDPTR[10H],80H
MOVBL,4
MOVAX,[10H]
DIVBL
(2)用BX作为地址指针,从BX所指的存单元[0010H]开始连续存入三个无符号数(10H、04H、30H),计算存单元中这三个数的和,并将和放在0013H单元中,再求出这三个数的乘积,并将乘积存入0014单元中,写出完成此功能的TEMPLATE程序。
(3)创建TEMPLATE程序,写出完成下述功能的程序段,并指出程序运行后AX=?
1)将15H传送到AL;
2)再将AL的容乘以2;
3)将15H传送到BL;
4)把AL的容乘以BL的容。
(4)创建以下两个程序段的TEMPLATE程序并上机验证。
1)给数据段中从偏移地址1000H开始的12个字存储单元的容赋值,请将第4条比较指令填写完整(划线处)。
MOVSI,1000H
NEXT:
MOVWORDPTR[SI],1
ADDSI,2
CMPSI,
JNENEXT
2)假定要按高地址到低地址的顺序进行清除操作(高地址从1016H开始),则上述程序段应如何修改?
简要说明ADD、SUB、AND、OR指令对标志位的影响。
6.报告要求
1)整理源程序段和运行结果,回答实验中的问题。
1.2.3移位指令
1)熟悉移位指令的功能。
移位指令包括:
1)非循环移位指令,如SAL,SAR,SHL,SHR;
2)循环移位指令,如ROL,ROR,RCL,RCR
按钮可以察看标志寄存器的值)。
程序段及结果表格如表13。
表13移位实验结果表格1
程序段
MOVAX,0
DECAX
ADDAX,3FFFH
ADDAX,AX
NOTAX
SUBAX,3
ORAX,0FBFDH
ANDAX,0AFCFH
SHLAX,1
RCLAX,1
(2)写出完成下述功能的TEMPLATE程序并上机验证,程序运行后的商=?
1)传送数据2058H到[DS:
1000H]单元中,数据12H到DS:
1002H单元中;
2)把DS:
1000H单元中的数据传送到AX寄存器;
3)把AX寄存器的容算术右移二位;
4)再把AX寄存器的容除以DS:
1002H字节单元中的数;
5)最后把商存入字节单元DS:
1003H中。
(3)创建TEMPLATE程序,输入以下程序段,单步执行并记录每一条指令对存单元的影响结果(提示:
在“emulator”对话框中,选择“view”菜单中的“memory”菜单项可以察看存单元的值),分析结果并说明该程序段的功能是什么。
程序段及结果表格如表14。
表14移位实验结果表格2
字单元[1A00H]=
字单元[1A02H]=
MOV[1A00H],0AA55H
MOV[1A02H],2AD5H
SHLWORDPTR[1A02H],1
CMP[1A00H],8000H
CMC
RCLWORDPTR[1A02H],1
RCLWORDPTR[1A00H],1
简要说明一般移位指令与循环移位指令之间的主要区别。
整理源程序段和运行结果,回答实验中的问题。
1.2.4串操作指令
1)熟悉串操作指令的功能。
2)了解串操作指令的使用方法。
串操作指令包括:
1)串传送指令MOVS;
2)串比较指令CMPS;
3)串扫描指令SCAS;
4)串装入指令LODS;
5)串存储指令STOS。
(1)创建TEMPLATE程序,输入以下程序段,单步执行并根据结果回答后面的问题。
CLD
MOVDI,1000H
MOVAX,55AAH
MOVCX,10H
REPSTOSW
上述程序段执行后:
1)从ES:
1000H开始的16个字单元的容是什么?
在“emulator”对话框中,选择“view”菜单中的“memory”菜单项可以察看存单元的值)
2)DI=?
CX=?
解释其原因。
(2)在上题的基础上,再输入以下程序段并执行,回答后面的问题。
MOVDI,2000H
MOVCX,20H
REPMOVSB
程序段执行后:
2000H开始的16个字单元的容是什么?
2)SI=?
DI=?
并分析之。
(3)在以上两题的基础上,再分别输入以下三个程序段并运行之。
程序段1:
REPZCMPSW
程序段1执行后:
1)ZF=?
根据ZF的状态,两个串是否比较完了?
按钮可以察看标志寄存器的容)
程序段2:
MOV[2008H],4455H
程序段2执行后:
程序段3:
MOVAX,4455H
REPNZSCASW
程序段3执行后:
根据ZF的状态,在串中是否找到了数据4455H?
(4)从DS:
6000H开始存放有一个字符串"
Thisisastring"
,把这个字符串从后往前传送到DS:
6100H开始的存区域中(即传送结束后,从DS:
6100H开始的存单元的容为"
gnirtsasisihT"
),试编写TEMPLATE程序并上机验证。
可以在数据区中直接输入字符串)
1)简要说明执行串操作指令之前应初始化哪些寄存器和标志位。
2)总结串操作指令的用途及使用方法。
整理源程序段和运行结果,对结果进行分析。
1.2.5DOS功能调用
1)掌握简单的DOS系统功能调用。
本节要用到的DOS功能命令包括:
从键盘输入单个字符的语句如下:
MOVAH,1
INT21H
以上两条指令执行后,(AL)=从键盘输入的字符
在屏幕上显示单个字符的语句如下:
MOVDL,<
要显示的字符>
MOVAH,2
注意:
源程序中所有语法符号都必须是半角符号,而且不允许汉字字符。
在屏幕上显示字符串的语句如下:
LEADX,<
字符串变量名,字符串必须以字符′$′作为结束>
MOVAH,9
从键盘上输入字符串的语句如下:
键盘缓冲区名>
MOVAH,0AH
(1)字符的输入和输出
从键盘读入一个小写字母,输出字母表中倒数与该字母序号相同的那个字母。
例如输入首字母a,则输出最后一个字母z,输入第4个字母d则输出倒数第4个字母w。
程序流程图如图17所示。
图17字符输入输出的程序流程图
程序框架如下:
datasegment
pkeydb"
pressanykey...$"
ends
stacksegment
dw128dup(0)
codesegment
start:
;
setsegmentregisters:
movax,data
movds,ax
moves,ax
从键盘输入一个字符的指令序列
根据流程图中转换算法编制的指令序列
用于显示结果的指令序列
leadx,pkey
movah,9
int21h;
outputstringatds:
dx
;
waitforanykey....
movah,1
int21h
movax,4c00h;
exittooperatingsystem.
int21h
endstart;
setentrypointandstoptheassembler.
编写EXETEMPLATE程序(提示:
计算’z’-al+’a’时,需要用sub指令),观察执行结果。
(2)字符串的输入和输出
从键盘输入一个字符串(以下说明中,假定键盘缓冲区的名字为KBUF,要显示的字符串变量名为STR),将输入的字符串传送给STR变量,在屏幕上显示STR变量中的容。
程序流程图如图18所示。
图18字符串输入输出的程序流程图
KBUFdb20,0,20dup(20h)
STRdb20dup(20h),′$′
从键盘输入字符串的指令序列
将KBUF传送到STR的指令序列
显示STR容的指令序列
movah,9h
CX的初始值不为0),观察执行结果。
1)对实验容1,在程序中增加显示提示字符串"
Pleaseinputalowercaseletter"
和"
Theinverseletteris:
"
,修改程序并上机验证。
2)对实验容2,在程序中增加显示提示字符串"
Pleaseinputastring"
Thestringyouinputis:
2)说明DOS系统功能调用的10号功能对键盘缓冲区格式上有何要求。
3)DOS系统功能调用中的1、2、9、10号功能的输入输出参数有哪些?
分别放在什么寄存器中?
4)总结汇编语言程序中如何实现字符和字符串的输入输出。
1.2.6顺序程序
1)了解8086汇编程序的基本结构;
2)掌握顺序程序的基本设计方法。
顺序程序是控制流仅有一个走向的程序,它主要用于解决一些无需进行判断分支,也无需循环执行的简单问题。
本节的实验容与乘法和除法运算有关。
无符号数乘法运算使用MUL指令,有符号数乘法运算使用IMUL指令。
乘法运算属于隐含操作数的运算,因此在使用乘法指令前,需要先将乘数放入AL(8位乘法)或AX(16位乘法)中。
乘法指令执行后,乘积在AX(8位乘法)或DX:
AX(16位乘法)中。
无符号数除法运算使用DIV指令,有符号数除法运算使用IDIV指令。
除法运算属于隐含操作数的运算,因此在使用除法指令前,需要先将被除数放入AX(8位除法)或DX:
AX(16位除法)中。
当除数为8位时,被除数应为16位;
除数为16位时,被除数应为32位。
对无符号数除法,当被除数字长不够时,高位部分可直接补0;
而对有符号数除法,当被除数字长不够时,必须使用符号扩展指令进行扩展。
除法运算执行后,结果在AX(8位除法)或DX:
AX(16位除