计算机硬件技术基础实验指导书V13Word格式.docx
- 文档编号:19286508
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:109
- 大小:1.27MB
计算机硬件技术基础实验指导书V13Word格式.docx
《计算机硬件技术基础实验指导书V13Word格式.docx》由会员分享,可在线阅读,更多相关《计算机硬件技术基础实验指导书V13Word格式.docx(109页珍藏版)》请在冰豆网上搜索。
操作数项包含0个、一个或多个操作数,依赖于具体的指令或伪指令。
多个操作数之间以逗号(,)分隔。
注释项以分号(;
)开始。
汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM6.0开始可以是512个字符),汇编语言对大小写是不敏感的。
为了使程序具有较好的可读性,应该使各个项对齐。
通常将名字项放在第一列,后面的几项依次以一个或多个TAB分隔。
1.1.2数据定义
通过数据定义语句可为数据项分配存储单元,并根据需要设置其初值。
还可用符号代表数据项,此时符号就与分配的存储单元相联系。
代表数据项的符号本身称为变量名,与之相对应的存储单元用于存放变量,所以常常就把这样的存储单元称为变量。
[例1.1]定义字节数据
COUNTDB100;
定义一个字节的存储空间,存放100
BUFFDB3+4,5*6;
定义两个字节的存储空间,存放7,30
[例1.2]定义字数据
FLAG1DW65530;
定义一个字存储空间,存放65530
FLAG2DW0F020H;
定义一个字存储空间,存放0F020H
[例1.3]定义没有初值的数据项
BUF1DW?
?
;
定义两个字存储空间,没有定义初值
[例1.4]定义字符串
MESS1DB“HELLO!
”;
定义一个字符串,内容是HELLO!
MESS2DB‘H’,’E’,’L’,’L’,’O’,’!
’;
[例1.5]重复操作符DUP
BUF2DB5DUP(0);
定义5个字节的存储空间,初值均为0
[例1.6]使用EQU定义等值表达式
COUNTEQU234;
[例1.7]使用等号定义
COUNT=234;
[例1.8]使用$定义
$是一个特殊的地址表达式,表示当前地址。
XDW0,1,2,4,8,4,2,1,0;
LENDB$-X;
变量LEN的值等于18
1.2汇编语言程序的结构
汇编语言源程序建立在段结构的基础上,一个段就是一些指令和数据的集合。
所以一个汇编语言源程序,根据程序用途被划分成几段,如数据段、堆栈段、附加段和程序段(代码段),用CS、DS、SS、ES段寄存器存放段值。
这样就构造了源程序的基本格式:
DATASEGMENT
┊
DATAENDS
EXTRASEGMENT
EXTRAENDS
STACK1SEGMENT
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
ASSUMESS:
STACK1,ES:
EXTRA
START:
MOVAX,DATA
MOVDS,AX
CODEENDS
ENDSTART
结合上面的源程序结构格式,需要说明如下:
(1)互相配对的SEGMENT和ENDS前的标号必须一样;
(2)ASSUME语言使汇编程序得知哪一段是数据段(DS),哪一段是堆栈段(SS),哪一段是附加段(ES),哪一段是代码段(CS)。
除CS段以外,各个段寄存器的实际值还要用MOV指令来赋予;
(3)ENDSTART表示源程序结束。
下面,我们通过一个简单的汇编语言程序来说明汇编语言的结构
DSEGSEGMENT;
数据段开始
DATA1DB13H,26H
DATA2DW0
DSEGENDS;
数据段结束
SSEGSEGMENTSTACK;
堆栈段开始
SKTOPDB20DUP(0)
SSEGENDS;
堆栈段结束
CSEGSEGMENT;
代码段开始
CSEG,DS:
DSEG
SSEG
MOVAX,DSEG;
初始化数据段基址
MOVDS,AX
MOVAX,SSEG;
初始化代码段基址
MOVSS,AX
MOVSP,LENGTHSKTOP;
设置堆栈指针
MOVAL,DATA1
ADDAL,DATA1+1
MOVBYTEPTRDATA2,AL
MOVAH,4CH
INT21H;
返回DOS
CSEGENDS;
代码段结束
ENDSTART;
源程序结束
说明如下:
(1)DSEG是用户自定义的数据段的段名,SEGMENT和ENDS分别为表示段开始和结束的伪指令。
(2)SSEG是堆栈段的段名,STACK表示此段是程序运行时使用的堆栈段,连接程序要求定义一个堆栈段,若无此段,连接程序指出“无堆栈段”错误。
(3)CSEG是代码段的段名,一般要先用ASSUME语句指定哪一段是数据段,哪一段是堆栈段和代码段,但是段寄存器的实际地址仍需MOV指令赋予。
(4)ENDSTART说明,START为程序的启动地址,即程序从这里开始执行,而END告诉汇编程序源程序到此结束,对END后面的任何语句都不再进行汇编。
1.3汇编语言常用伪指令
一、表达式赋值伪指令
1.等值定义EQU
格式:
符号名EQU表达式
说明:
将右侧表达式的值或意义赋给左侧自定义的标识符号。
表达式可以是各种常数、数据符号、指令助记符、伪指令助记符、寄存器名字或其它自定义标识符号。
在同一个程序中,一个用EQU定义的符号不能被再定义。
2.等号伪指令=
符号名=表达式
作用与EQU相同,惟一的区别是等号语句可以多次被定义。
二、数据定义伪指令
1.定义字节变量DB
[变量名]DB表达式[,表达式]…
DB用于定义字节变量,每个表达式的值占有一个字节。
字节的值域对无符号数为0~255,对带符号数为-128~+127。
初值表中各项数据用逗号隔开,每项数据占一个字节单元。
如果处置表中的初值为“?
”,则对应单元字节将不赋初值,其内容为不确定值。
2.定义字变量DW
[变量名]DW表达式[,表达式]…
DW用于定义字变量。
初值表中各项数据为字,占两个字节,并且字单元不仅可以存放数值,还可以存放变量的偏移地址。
3.定义双字变量DD
[变量名]DD表达式[,表达式]…
DD用于定义双字变量,每个数据项占四个字节。
它可以是表达式、十进制整数、字符串、“?
”或是一个变量、标号的段地址和偏移地址。
4.定义四字变量DQ
[变量名]DQ表达式[,表达式]…
变量为四字变量,每个元素表达式占八个字节,它可以是表达式、?
、十进制实数、实数的十六进制编码及字符串。
5.定义十字节变量DT
[变量名]DT表达式[,表达式]…
变量为十字节变量,每个元素表达式占十个字节,它可以是表达式、?
、十进制整数、BCD数及字符串。
6.变量重复定义子句DUP
重复次数DUP(元素值)
重复次数取正整数,元素值可为数值表达式或“?
”
三、段定义伪指令
1.段首说明伪指令SEGMENT
段名SEGMENT[PRMT1][PRMT2][‘PRMT3’]
段名是用户自定义的标识符号。
这个语句的作用是告诉汇编程序具有这个名字的段由此开始。
PRMT分别为定位类型,组合类型,连接期间用于组或段组的名称,为任选参数。
2.段结束伪指令ENDS
段名ENDS
此语句告诉汇编程序这个名字命名的段到此结束。
3.段假定伪指令ASSUME
ASSUME段寄存器名:
段名[,段寄存器名:
段名]…
ASSUME的作用是告诉汇编程序,把源程序转换为机器代码时,各段寄存器的符号地址,以确定和检查机器指令中操作数所在的段,产生正确的机器指令代码或打印出错误信息。
4.代码定位伪指令ORG
ORG表达式
此语句的作用是确定其后的数据和代码存放在相应段的起始位置。
表达式的值是相对于段基址的偏移量。
四、过程定义伪指令
过程名PROC[类型]
…
RET
过程名ENDP
伪指令PROC和ENDP必须成对,并给出相同的过程名。
过程有两种类型FAR和NEAR,如未指出,则为NEAR。
五、其它伪指令
1.EVEN伪指令
EVEN
EVEN的作用是将汇编地址计数器调整到偶地址边界,以便随后的数据或代码在偶地址边界上对准。
2.END伪指令
END[STRAT]
START为程序的启动地址。
END告诉汇编程序源程序到此结束,对END后面的任何语句不再进行汇编。
第2章汇编语言程序调试过程
2.1汇编语言程序的命令行开发调试过程
一般汇编语言的上机过程是首先用某一个文本编辑器形成一个以ASM为扩展名的源程序文件,然后用汇编程序翻译源程序,将ASM文件转换为OBJ模块文件,最后用连接程序将一个或多个目标文件链接成—个可执行文件。
2.1.1编辑源程序
可用计算机系统中各种能编辑文本文件的编辑器来编辑汇编源程序。
常用的编辑器有:
EDIT、记事本、UltraEdit、EditPlus等。
利用这些文本编辑工具编辑源程序,生成一个汇编语言源程序的纯文本文件。
汇编语言源程序文件的扩展名是:
.ASM。
这里介绍利用EDIT行编辑程序来编辑汇编源程序的过程。
运行EDIT程序可以在Windows操作系统的命令提示符,可以有两种方法运行命令提示符,一种是从开始菜单—〉程序—〉附件—〉命令提示符,如下图所示。
图2.1
另外一种方法是在开始—〉运行对话框里输入cmd后回车,如下图所示。
图2.2
进入命令提示符界面如下。
输入cd\命令后改变当前目录到C盘根目录下。
输入edit命令就可以进入编辑环境了。
图2.3
进入edit编辑环境界面如下,在这里可以输入汇编源程序了。
汇编语言源程序一行安排一条语句,不采用类似C或者PASCAL等高级语言源程序那样的分层次缩进格式。
如下是汇编语言源程序的一般格式。
请注意上下行之间的指令助记符及第一个操作数首字符的对齐,利用制表符(TAB键)能较好的实现对齐格式。
图2.4
输入完程序后,需要保存文件,选择File—〉Save命令,如下图所示。
图2.5
选择Save命令后出现如下对话框。
在FileName:
一栏里输入保存的文件名,此处为Hello.asm。
输入完后选择OK。
图2.6
保存成功,标题栏变为刚才所输入的文件名,如下图所示。
保存完毕后,选择File—〉Exit命令退出编辑程序,返回到命令行提示符界面。
图2.7
这样,源程序的编辑过程就完成了。
需要注意的是:
使用Windows的记事本编辑汇编源程序时,默认的扩展名是.TXT。
在保存文件时,需要将文件扩展名修改成.ASM。
2.1.2汇编程序
当源程序编写好后,利用汇编器MASM汇编源程序生成目标代码文件。
通常目标代码文件的扩展名是.OBJ。
汇编器还可以生成列表文件和交叉参考文件。
汇编器相当于高级语言程序设计中的编译器。
汇编器按汇编语言的语法检查源程序,如果源程序中有语法错误的行,那么汇编器就不生成目标代码文件,汇编程序将显示出错误位置和原因。
这种情况下,必须回到第一步,重新编辑源程序,修改语法错误的行。
如果源程序没有语法错误,那么,将生成目标文件(.OBJ文件)。
当发现源程序中的某些行含可疑成分或不确定因素时,汇编器会给出警告信息,但仍按缺省处理办法生成目标代码文件。
这种情况下,可以重新编辑源程序,消除可疑成分或不确定因素。
MASM是微软提供的用于对汇编源程序进行编译的程序。
可以输入masm/?
来查看这个命令的使用方法,如下图所示。
图2.8
接下来对编辑完毕后的源程序进行汇编,在命令行提示符下输入masmhello.asm命令就可以对汇编源程序编译了,如下图所示。
图2.9
从编译结果可以看出,在hello.asm的17行有错误,错误类型是符号STRAT没有定义。
这时候需要返回edit编辑环境对源程序进行修改。
因为hello.asm文件已经存在,我们可以直接在命令行下输入edithello.asm命令来修改程序。
图2.10
修改后保存文件,退出编辑环境。
重新进行汇编,结果如下。
图2.11
编译通过以后,可以在hello.asm所在的目录下生成一个hello.obj的文件,这个就是编译得到的目标文件。
2.1.3连接程序
当由源文件汇编成功后,即可用连接程序(LINK.EXE)生成其可执行文件。
通常DOS平台上的可执行文件的扩展名是.EXE。
一般单个模块的连接不会发生连接错误,总可以顺利地生成可执行文件。
当多个模块连接,或者与库中的函数连接时,如果在目标代码文件或者库中找不到所需的连接信息,连接器就会发出错误提示信息,而不生成可执行程序文件。
这就需要修改源程序,使得汇编器生成的目标代码文件含有连接器需要的信息。
这样的修改主要是对伪指令和汇编语言操作符的修改,或者是对名字符号的修改。
如果出现这种情况,那么就要回到第一步编辑源程序,还要重新进行第二步汇编源程序。
和masm程序一样,可以输入link/?
命令来查看link程序的使用方法。
输入linkhello.obj命令就可以对编译生成的目标文件(hello.obj)进行连接,如下图所示。
图2.12
这种方法需要确认连接过程中的各种文件名,如果使用文件名的默认值,那么直接按“回车”键即可。
在上面四个文件名中,最重要二个文件名是:
执行文件名和库文件名。
一般情况下,无需更换最终生成的执行文件名;
如果在连接过程中需要其它的库文件,则在显示第三行提示时,输入所需要的库文件名。
连接成功后,在目标程序所在的目录下生成一个.EXE文件。
可以在命令提示符下,直接输入生成的可执行文件的文件名来运行程序,如果程序正确,就可以得到预期的结果,如下图所示。
图2.13
技巧提示:
如果不想每次连接过程中确认各种文件名,可以在文件名后面加上分号“;
”,默认使用各类文件的缺省值。
例如输入linkhello.obj;
后回车。
从MASM6.0版本开始,微软提供了一个ML.EXE程序来对汇编源程序编译和连接。
其实,ML.EXE的文件名就是MASM.EXE和LINK.EXE的首字符,所以ML程序就是MASM和LINK两个程序的集成。
具体使用方法如下图所示。
图2.14
2.1.4调试程序
当程序的运行结果不是预期结果时,就需要调试程序,找出错误的语句或逻辑关系。
可以使用系统调试程序DEBUG来进行调试。
启动DEBUG的一般命令如下:
DEBUG文件名[参数表]
其中文件名指定被调试的文件,其包括名和后缀,参数表是被调试文件运行时所需要的参数。
被调试的文件可以是系统中的任何文件,但通常它们的后缀为.EXE或.COM。
当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种DEBUG命令。
如下图所示。
图2.15
DEBUG后可以不带文件名,仅运行DEBUG程序;
需要时,再用N和L命令调人被调试程序。
DEBUG命令及其含义如下表所示:
命令格式
功能说明
A
[地址]
输入汇编指令
C
[范围]起始地址
对由“范围”指定的区域与“起始地址”指定的同大小区域进行比较,显示不相同的单元
D
[范围]
显示指定范围内的内存单元内容
E
地址字节值表
用值表中的值替换从“地址”开始的内存单元内容
F
范围字节值表
用指定的字节值表来填充内存区域
G
[=起始地址][断点地址]
从起点(或当前地点)开始执行,到终点结束
H
数值1数值2
显示二个十六进制数值之和、差
I
端口地址
从端口输入
L
[地址[驱动器号扇区扇区数]]
从磁盘读
M
范围地址
把“范围”内的字节值传送到从“地址”开始的单元
N
文件标识符[文件标识符…]
指定文件名,为读/写文件做准备
O
端口地址字节值
向端口输出
P
[=地址][指令数]
按执行过程,但不进入子程序调用或软中断
Q
退出DEBUG,不保存正在调试的文件
R
[寄存器名]
显示和修改寄存器内容
S
在内存区域内搜索指定的字节值表。
如果找到,显示起始地址,否则,什么也不显示
T
跟踪执行,从起点(或当前地点)执行若干条指令
U
反汇编,显示机器码所对应的汇编指令
W
向磁盘写内容,(BX、CX)为写入字节数
关于参数的几点说明:
1.进制:
在DEBUG中输入或显示的数据都是十六进制形式;
2.分隔:
命令和参数、参数和参数之间要用空格、逗号或制表符等分隔;
3.地址:
用“段值:
偏移量”的形式来表示地址,也可用段寄存器来代表“段值”。
例如:
DS:
10,ES:
200,CS:
30等;
4.范围:
用来表示地址范围,从哪个地址开始,到哪个地址结束。
它有二种表示方式:
●地址地址——前者表示起始地址,要用“段值:
偏移量”来表达,后者表示终止地址,只用“偏移量”来表示;
●地址长度——前者表示起始地址,要用“段值:
偏移量”来表达,后者表示该区域的大小,用字母’L’开头的数值来表示;
100:
50100——段值为100,偏移量从50到100的内存区域;
50L100——段值为100,偏移量从50开始的100个字节区域。
5.端口地址:
二位十六进制数值;
6.字节值:
7.字节值表:
由若干个字节值组成,也可以是用引号括起来的字符串;
8.驱动器号:
0—驱动器A、1—驱动器B、2—驱动器C、3—驱动器D等;
9.命令是单个字母,命令和参数的大小写可混合输入;
10.可用F1、F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令;
11.当命令出现语法错误时,将在出错位置显示“^Error”;
12.可用Ctrl+C或Ctrl+Break来终止当前命令的执行,还可用Ctrl+S来暂停屏幕显示(当连续不断地显示信息时)。
下面对DEBUG命令作具体介绍:
1.内存显示命令D(DumpCommand)
D命令用来显示内存单元的值,包括下列两种格式:
(1)D[<
地址>
]
显示由指定地址开始的若干内存单元的值。
对于80列显示模式,显示128个字节。
如果未指定参数,则一个D命令的结束地址开始显示。
若前面未用过D命令,则缺省从CS:
IP开始显示。
(2)D<
地址范围>
该命令显示由<
指定的所有内存单元的值。
执行D命令后,屏幕左边显示的是内存地址,中间是从该地址开始的若干字节值(十六进制),右边是每个字节对应得ASCII字符,其中,“.”表示不可打印字符。
若只给出偏移地址,则使用DS当前值作为段地址。
D2000:
100;
显示从2000:
0100H开始的内存单元的值
D100;
显示从DS:
100H开始的内存单元的值
DCS:
显示从CS:
D;
IP开始的内存单元的值
2.内存修改命令E(EnterCommand)
E命令用来设置指定内存单元的值,包括下列两种格式:
(1)E<
;
(2)E<
<
字节表>
。
若只给出偏移地址,则使用DS当前值作为段地址。
第一种格式以交互方式逐个修改连续的内存单元。
键入该命令后,DEBUG显示指定地址及相应内存单元的值,等待用户修改。
此时,可以采取下列操作:
●输入一个新的值;
●键入空格跳到下一个地址单元;
●键入“-”返回上一个地址单元;
●按回车键结束E命令。
第二种格式用<
来修改从指定地址开始的内存区域。
DEBUG将这些值依次写入始于指定地址的连续内存单元。
其中,<
是以空格或逗号分隔的若干十六进制字节或字符串。
E01‘123’0A;
将内存单元DS:
0~DS:
4的值设置为01H、31H、32H、33H、0AH
注意,E命令后必须指定内存地址。
3.寄存器命令R(RegisterCommand)
R命令用来显示和修改寄存器的值,包括下列两种格式。
(1)R
显示所有寄存器和8个标志位的值,并反汇编CS:
IP所指的命令。
(2)R<
寄存器名>
显示指定寄存器的值,并等待用户键入新的值,按回车键结束R的命令。
只能是8086的16位寄存器AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS、IP、与F(标志寄存器)。
其中,显示的8个标志位的符号对应符号如下表所示。
标志名称
溢出
OF
方向
DF
中断
IF
负号
SF
零
ZF
辅助进位
AF
奇偶
PF
进位
CF
置位状态
OV
DN
EI
NG
ZR
AC
PE
CY
复位状态
NV
UP
DI
PL
NZ
NA
PO
NC
如果想修改标志寄存器的内容,可以输入如下命令。
-RF
屏幕将显示8个标志位的值,然后等待用户修改。
只要输入这些符号就可以设置对应标志位的值,键入符号的个数与顺序可以任意。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件 技术 基础 实验 指导书 V13