汇编语言程序设计实验篇.docx

上传人:b****9 文档编号:25171449 上传时间:2023-06-05 格式:DOCX 页数:46 大小:209.28KB
下载 相关 举报
汇编语言程序设计实验篇.docx_第1页
第1页 / 共46页
汇编语言程序设计实验篇.docx_第2页
第2页 / 共46页
汇编语言程序设计实验篇.docx_第3页
第3页 / 共46页
汇编语言程序设计实验篇.docx_第4页
第4页 / 共46页
汇编语言程序设计实验篇.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计实验篇.docx

《汇编语言程序设计实验篇.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验篇.docx(46页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计实验篇.docx

汇编语言程序设计实验篇

1.1.汇编系统软件简介

Emu8086-MicroprocessorEmulator是集源代码编辑器、汇编/反汇编工具以及debug的模拟器。

它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。

该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。

利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。

1.1.1创建程序

1.COMTEMPLATE程序

本章与指令相关的实验都是用COMTEMPLATE类型的程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choosecodetemplate”对话框中,选择“COMtemplate-simpleandtinyexecutablefileformat,puremachinecode.”后,单击按钮。

在如所示的编辑界面中,在“;addyourcodehere”部分输入相应的指令,第一条指令默认的偏移地址为100h。

输入全部指令后,单击按钮,保存相应的程序段。

2.EXETEMPLATE程序

本章与DOS功能调用和汇编源程序相关的实验都是用EXETEMPLATE程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choosecodetemplate”对话框中,选择“EXEtemplate-advancedexecutable:

relocation,checksum.”后,单击按钮。

在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“addyourdatahere”和“;addyourcodehere”部分可以分别输入相应的变量定义和指令。

输入全部指令后,单击按钮,保存相应的程序。

1.1.2执行程序

在编辑界面中,如图所示,单击按钮,自动完成源程序的编译和链接。

在“emulator”对话框中(),左边部分列出了寄存器的当前值,右边部分是已经输入的程序段,中间部分是右边每条指令的物理地址和对应的机器代码,中间的文本框中列出了当前指令的CS和IP。

单击按钮,可以单步执行一条指令;单击按钮,可以一次执行完所有程序;单击按钮,可以重新回到第一条指令的位置处;单击按钮,可以重新加载另一个程序。

修改“emulator”对话框中文本框的内容,也可以观察其它段的内容,在图所示界面中,DS=0700H,若要察看该数据段中偏移地址为6000H位置处的内存单元内容,可以在文本框中输入0700:

6000,显示结果如图所示,中间部分依次列出从该地址开始的所有字节的内容。

在“emulator”对话框的底部,单击按钮,可以观察栈的内容;单击按钮,可以观察标志寄存器中标志位的内容。

在“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)创建COMTEMPLATE程序,输入以下程序段,观察程序的执行情况,程序段如下:

MOVBL,08H;BX=?

MOVCL,BL;CL=?

MOVAX,03FFH;AX=?

MOVBX,AX;BX=?

MOVDS:

[6000H],BX;DS:

[6000H]=?

(提示:

在emulator对话框中间的文本框中输入段基地址:

段内偏移地址,可以观察其它逻辑段相应存储单元的内容)

(2)创建COMTEMPLATE程序,用以下程序段将一组数据压入PUSH堆栈区,然后通过三种不同方式出栈。

观察栈的变化情况(提示:

在emulator对话框中,单击按钮可以察看栈中内容)以及出栈后数据的变化情况,并把结果填入表11中。

程序段如下:

MOVAX,0102H

MOVBX,0304H

MOVCX,0506H

MOVDX,0708H

PUSHAX

PUSHBX

PUSHCX

PUSHDX

第—种出栈方式的指令序列:

POPDX

POPCX

POPBX

POPAX

第二种出栈方式的指令序列(注:

替换掉第—种出栈方式的指令序列):

POPAX

POPBX

POPCX

POPDX

第三种出栈方式的指令序列(注:

替换掉第二种出栈方式的指令序列):

POPCX

POPDX

POPAX

POPBX

表11数据传送实验结果表格

寄存器的值

第一种出栈方式

第二种出栈方式

第三种出栈方式

(AX)=

(BX)=

(CX)=

(DX)=

(3)创建COMTEMPLATE程序,分别输入下列指令,按要求设置各寄存器及内存单元的值(提示:

在“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)创建COMTEMPLATE程序,试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,将DS:

6000H字节存储单元中的内容传送到DS:

6020H单元中。

(5)设AX=1111H,BX=2222H,[DS:

6010H]=3333H。

试编写COMTEMPLATE程序,将AX的内容与BX的内容交换,然后再将BX的内容与DS:

6010H单元的内容进行交换。

(6)若[DS:

6000H]=0EEFFH,[ES:

7000H]=0CCDDH,请编写COMTEMPLATE程序,将两个存储单元的内容交换。

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.实验目的

1)熟悉算术逻辑运算指令的功能。

2)了解标志寄存器中各标志位的意义以及指令执行对它的影响。

2.实验设备

微型计算机、emu8086

3.实验原理

算术运算指令包括:

1)加法指令,如ADD,ADC,INC;2)减法指令,如SUB,SBB,DEC,NEG,CMP;3)乘法指令,如MUL,IMUL;4)除法指令,如DIV,IDIV。

逻辑运算指令包括:

AND,OR,NOT,XOR,TEST

4.实验内容

(1)创建COMTEMPLATE程序,输入以下程序段,单步执行并记录标志位的变化情况(提示:

在emulator对话框中,单击按钮察看标志寄存器的值)。

程序段及结果表格如表12。

表12算术逻辑运算实验结果表格

标志位

程序

CF

ZF

SF

OF

PF

AF

程序段1

0

0

0

0

0

0

MOVAX,1018H

MOVSI,230AH

ADDAX,SI

ADDAL,30H

MOVBX,3FFH

ADDAX,BX

MOV[20H],1000H

ADD[20H],AX

PUSHAX

POPBX

程序段2

0

0

0

0

0

0

MOVAX,0A0AH

ADDAX,0FFFFH

MOVCX,0FF00H

ADCAX,CX

SUBAX,AX

INCAX

ORCX,0FFH

ANDCX,0F0FH

MOV[10H],CX

程序段3

0

0

0

0

0

0

MOVBL,25H

MOVBYTEPTR[10H],4

MOVAL,[10H]

MULBL

程序段4

0

0

0

0

0

0

MOVWORDPTR[10H],80H

MOVBL,4

MOVAX,[10H]

DIVBL

(2)用BX作为地址指针,从BX所指的内存单元[0010H]开始连续存入三个无符号数(10H、04H、30H),计算内存单元中这三个数的和,并将和放在0013H单元中,再求出这三个数的乘积,并将乘积存入0014单元中,写出完成此功能的COMTEMPLATE程序。

(3)创建COMTEMPLATE程序,写出完成下述功能的程序段,并指出程序运行后AX=?

1)将15H传送到AL;

2)再将AL的内容乘以2;

3)将15H传送到BL;

4)把AL的内容乘以BL的内容。

(4)创建以下两个程序段的COMTEMPLATE程序并上机验证。

1)给数据段中从偏移地址1000H开始的12个字存储单元的内容赋值,请将第4条比较指令填写完整(划线处)。

MOVSI,1000H

NEXT:

MOVWORDPTR[SI],1

ADDSI,2

CMPSI,

JNENEXT

2)假定要按高地址到低地址的顺序进行清除操作(高地址从1016H开始),则上述程序段应如何修改?

5.实验习题

简要说明ADD、SUB、AND、OR指令对标志位的影响。

6.报告要求

1)整理源程序段和运行结果,回答实验中的问题。

1.2.3移位指令

1.实验目的

1)熟悉移位指令的功能。

2)了解标志寄存器中各标志位的意义以及指令执行对它的影响。

2.实验设备

微型计算机、emu8086

3.实验原理

移位指令包括:

1)非循环移位指令,如SAL,SAR,SHL,SHR;2)循环移位指令,如ROL,ROR,RCL,RCR

4.实验内容

(1)创建COMTEMPLATE程序,输入以下程序段,单步执行并记录标志位的变化情况(提示:

在emulator对话框中,单击按钮可以察看标志寄存器的值)。

程序段及结果表格如表13。

表13移位实验结果表格1

标志位

程序

CF

ZF

SF

OF

PF

AF

程序段

0

0

0

0

0

0

MOVAX,0

DECAX

ADDAX,3FFFH

ADDAX,AX

NOTAX

SUBAX,3

ORAX,0FBFDH

ANDAX,0AFCFH

SHLAX,1

RCLAX,1

(2)写出完成下述功能的COMTEMPLATE程序并上机验证,程序运行后的商=?

1)传送数据2058H到[DS:

1000H]单元中,数据12H到DS:

1002H单元中;

2)把DS:

1000H单元中的数据传送到AX寄存器;

3)把AX寄存器的内容算术右移二位;

4)再把AX寄存器的内容除以DS:

1002H字节单元中的数;

5)最后把商存入字节单元DS:

1003H中。

(3)创建COMTEMPLATE程序,输入以下程序段,单步执行并记录每一条指令对内存单元的影响结果(提示:

在“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

5.实验习题

简要说明一般移位指令与循环移位指令之间的主要区别。

6.实验报告要求

整理源程序段和运行结果,回答实验中的问题。

1.2.4串操作指令

1.实验目的

1)熟悉串操作指令的功能。

2)了解串操作指令的使用方法。

2.实验设备

微型计算机、emu8086

3.实验原理

串操作指令包括:

1)串传送指令MOVS;2)串比较指令CMPS;3)串扫描指令SCAS;4)串装入指令LODS;5)串存储指令STOS。

4.实验内容

(1)创建COMTEMPLATE程序,输入以下程序段,单步执行并根据结果回答后面的问题。

CLD

MOVDI,1000H

MOVAX,55AAH

MOVCX,10H

REPSTOSW

上述程序段执行后:

1)从ES:

1000H开始的16个字单元的内容是什么?

(提示:

在“emulator”对话框中,选择“view”菜单中的“memory”菜单项可以察看内存单元的值)

2)DI=?

CX=?

解释其原因。

(2)在上题的基础上,再输入以下程序段并执行,回答后面的问题。

MOVSI,1000H

MOVDI,2000H

MOVCX,20H

REPMOVSB

程序段执行后:

1)从ES:

2000H开始的16个字单元的内容是什么?

2)SI=?

DI=?

CX=?

并分析之。

(3)在以上两题的基础上,再分别输入以下三个程序段并运行之。

程序段1:

MOVSI,1000H

MOVDI,2000H

MOVCX,10H

REPZCMPSW

程序段1执行后:

1)ZF=?

根据ZF的状态,两个串是否比较完了?

(提示:

在emulator对话框中,单击按钮可以察看标志寄存器的内容)

2)SI=?

DI=?

CX=?

并分析之。

程序段2:

MOV[2008H],4455H

MOVSI,1000H

MOVDI,2000H

MOVCX,10H

REPZCMPSW

程序段2执行后:

1)ZF=?

根据ZF的状态,两个串是否比较完了?

2)SI=?

DI=?

CX=?

并分析之。

程序段3:

MOVAX,4455H

MOVDI,2000H

MOVCX,10H

REPNZSCASW

程序段3执行后:

1)ZF=?

根据ZF的状态,在串中是否找到了数据4455H?

2)SI=?

DI=?

CX=?

并分析之。

(4)从DS:

6000H开始存放有一个字符串"Thisisastring",把这个字符串从后往前传送到DS:

6100H开始的内存区域中(即传送结束后,从DS:

6100H开始的内存单元的内容为"gnirtsasisihT"),试编写COMTEMPLATE程序并上机验证。

(提示:

可以在数据区中直接输入字符串)

5.实验习题

1)简要说明执行串操作指令之前应初始化哪些寄存器和标志位。

2)总结串操作指令的用途及使用方法。

6.实验报告要求

整理源程序段和运行结果,对结果进行分析。

1.2.5DOS功能调用

1.实验目的

1)掌握简单的DOS系统功能调用。

2.实验设备

微型计算机、emu8086

3.实验原理

本节要用到的DOS功能命令包括:

从键盘输入单个字符的语句如下:

MOVAH,1

INT21H

以上两条指令执行后,(AL)=从键盘输入的字符

在屏幕上显示单个字符的语句如下:

MOVDL,<要显示的字符>

MOVAH,2

INT21H

注意:

源程序中所有语法符号都必须是半角符号,而且不允许汉字字符。

在屏幕上显示字符串的语句如下:

LEADX,<字符串变量名,字符串必须以字符′$′作为结束>

MOVAH,9

INT21H

从键盘上输入字符串的语句如下:

LEADX,<键盘缓冲区名>

MOVAH,0AH

INT21H

4.实验内容

(1)字符的输入和输出

从键盘读入一个小写字母,输出字母表中倒数与该字母序号相同的那个字母。

例如输入首字母a,则输出最后一个字母z,输入第4个字母d则输出倒数第4个字母w。

程序流程图如图17所示。

图17字符输入输出的程序流程图

程序框架如下:

datasegment

pkeydb"pressanykey...$"

ends

stacksegment

dw128dup(0)

ends

codesegment

start:

;setsegmentregisters:

movax,data

movds,ax

moves,ax

从键盘输入一个字符的指令序列

根据流程图中转换算法编制的指令序列

用于显示结果的指令序列

leadx,pkey

movah,9

int21h;outputstringatds:

dx

;waitforanykey....

movah,1

int21h

movax,4c00h;exittooperatingsystem.

int21h

ends

endstart;setentrypointandstoptheassembler.

编写EXETEMPLATE程序(提示:

计算’z’-al+’a’时,需要用sub指令),观察执行结果。

(2)字符串的输入和输出

从键盘输入一个字符串(以下说明中,假定键盘缓冲区的名字为KBUF,要显示的字符串变量名为STR),将输入的字符串传送给STR变量,在屏幕上显示STR变量中的内容。

程序流程图如图18所示。

图18字符串输入输出的程序流程图

程序框架如下:

datasegment

KBUFdb20,0,20dup(20h)

STRdb20dup(20h),′$′

pkeydb"pressanykey...$"

ends

stacksegment

dw128dup(0)

ends

codesegment

start:

;setsegmentregisters:

movax,data

movds,ax

moves,ax

从键盘输入字符串的指令序列

将KBUF传送到STR的指令序列

显示STR内容的指令序列

leadx,pkey

movah,9h

int21h;outputstringatds:

dx

;waitforanykey....

movah,1

int21h

movax,4c00h;exittooperatingsystem.

int21h

ends

endstart;setentrypointandstoptheassembler.

编写EXETEMPLATE程序(提示:

CX的初始值不为0),观察执行结果。

5.实验习题

1)对实验内容1,在程序中增加显示提示字符串"Pleaseinputalowercaseletter"和"Theinverseletteris:

",修改程序并上机验证。

2)对实验内容2,在程序中增加显示提示字符串"Pleaseinputastring"和"Thestringyouinputis:

",修改程序并上机验证。

6.实验报告要求

1)整理源程序段和运行结果。

2)说明DOS系统功能调用的10号功能对键盘缓冲区格式上有何要求。

3)DOS系统功能调用中的1、2、9、10号功能的输入输出参数有哪些?

分别放在什么寄存器中?

4)总结汇编语言程序中如何实现字符和字符串的输入输出。

1.2.6顺序程序

1.实验目的

1)了解8086汇编程序的基本结构;

2)掌握顺序程序的基本设计方法。

2.实验设备

微型计算机、emu8086

3.实验原理

顺序程序是控制流仅有一个走向的程序,它主要用于解决一些无需进行判断分支,也无需循环执行的简单问题。

本节的实验内容与乘法和除法运算有关。

无符号数乘法运算使用MUL指令,有符号数乘法运算使用IMUL指令。

乘法运算属于隐含操作数的运算,因此在使用乘法指令前,需要先将乘数放入AL(8位乘法)或AX(16位乘法)中。

乘法指令执行后,乘积在AX(8位乘法)或DX:

AX(16位乘法)中。

无符号数除法运算使用DIV指令,有符号数除法运算使用IDIV指令。

除法运算属于隐含操作数的运算,因此在使用除法指令前,需要先将被除数放入AX(8位除法)或DX:

AX(16位除法)中。

当除数为8位时,被除数应为16位;除数为16位时,被除数

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1