第4章 汇编语言程序设计.docx
- 文档编号:15266243
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:56
- 大小:113.52KB
第4章 汇编语言程序设计.docx
《第4章 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《第4章 汇编语言程序设计.docx(56页珍藏版)》请在冰点文库上搜索。
第4章汇编语言程序设计
第四章汇编语言程序设计
基本内容:
汇编语言与高级语言的区别,汇编语言的作用,汇编语言的语句结构(标记、表达式、语句格式),汇编中的常用伪指令;汇编语言的上机过程。
基本要求:
了解汇编语言与高级语言的区别,理解汇编语言的作用,掌握汇编语言中的常数、表达式、标号、变量及常用伪指令的格式与用法,熟悉汇编语言的上机过程。
重点内容:
汇编语言中的常数、表达式、标号、变量及常用伪指令,语句行构成,汇编语言的上机过程。
难点:
常用伪指令的用途及格式。
汇编语言是一种面向机器指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。
用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快、实时性能好。
汇编语言被大量用于编写计算机系统程序、实时控制程序等。
第一节汇编语言的语句行构成及常用伪指令
汇编语言是助记符编写的符号语言,每个语句行一般可由四部分构成
[名字]操作码[操作数];[注释]
1名字项是一符号,它表示本条语句的符号地址。
一般来说,名字可以是标号和变量,统称为标识符。
注意:
标号和变量都具备3种属性——段属性、偏移属性及类型属性。
②操作符可以是机器指令、伪指令和宏指令的助记符。
③操作数是操作符的操作对象。
操作符在完成相应的操作时要求有一系列的操作数。
当有两个或两个以上的操作数时,各操作数之间用逗号隔开。
④注释项是以“;”开头的说明部分,用来说明程序和语句的功能,可以是指令末尾,也可以是行开头,但必以“;”号表明。
注释字段是语句的非执行部分。
其中,各项之间必须用空格符(一个或多个)隔开,名字项与操作数项间一般使用“∶”作分隔符,操作数项之间一般使用“,”作分隔符,操作数项与注释项间使用“;”作分隔符。
带方括号的项可有可无。
一、汇编语言的语句行构成
(一)标记
常用的标记有标识符,保留字,界符,常数和注释。
1、标识符
汇编语言每条语句的第一个字段是它的名字字段,名字可以是标号或变量,这两者又称为标识符。
(1)组成名字的字符
(i)字母A~Z、a~z;
(ii)数字0~9;
(iii)专用字符?
、.(点)、@、_(下划线)、$。
(2)组成名字的规则
(i)不能以数字开头
(ii)使用字符“·”时必须放在名字的第一个位置。
(iii)保留字(如操作码、寄存器名)和单独的问号(?
)不能作为名字。
(iiii)最大有效长度为31位,超过31位的部分计算机不再识别。
一般用做标号和变量名。
A.标号:
定义在代码段中,后面跟冒号,代表本语句得到符号地址,如NEXT:
MOVAL,5也可以做子程序名称,不跟冒号,如SENDPROCNEAR。
B.变量:
定义在代码段外的其他段中,后面不跟冒号,如SUMDW0实际上也是本变量的符号地址。
标号和变量具备3种属性:
段属性:
标号所在段的基地址,其值必须在一个段寄存器中。
标号的段是它所出现的对应代码段,由CS指示。
变量的段通常由DS或者ES指示。
偏移属性:
该属性表示标号和变量相距段起始地址的偏移字节数,该数是一个16位无符号数。
类型属性:
该属性对于标号而言,用于指出该标号是在本段内引用还是在其他段中引用。
标号的类型有NEAR(段内引用,指针长度为2字节)和FAR(段间引用,指针长度为4字节)。
对于变量,其类型属性说明变量有几个字节长度,这一属性由定义变量的伪指令确定。
2、保留字
汇编语言中预先保留的有特殊意义的符号,如指令,伪指令寄存器等,不可以用做标号或变量名。
3、常数
如立即数,直接地址等
十进制数:
后加字母D或不加,二进制加B,16进制加H,8进制加Q或O。
为了区别由A~F组成的一个字符串是十六进制数还是英文符号,规定凡以字母A~F为起始字符的十六进制数,必须在前面冠以数字“0”。
实数:
由整数、小数和指数三部分组成,是计算机中数据的浮点表示法。
实数一般用十进制数形式给出。
实数的格式如下:
±整数部分.小数部分E±指数部分
其中,整数和小数部分形成这个数的值,称作尾数,它可以是带符号的数。
指数部分由指数标识符E开始,它表示了值的大小,如5.213E-4。
字符串常数:
用单引号括起来的一个或多个字符。
这些字符以ASCII码形式存储在内存中。
例
SUBDH,22H;常数22H为立即数
MOVBX,[SI十32H];常数32H作位移量
DB12H;定义一个字节数据
DW1234H;定义一个字数据
DD12345678H;定义一个双字数据
DB‘9BD’;定义三个字节的字符串数据,在内存中就是39H、42H、44H
4、注释
便于理解和阅读程序,以增加程序的可读性,前用分号。
建议:
为了提高程序的易读性,把程序中的所有指令助记符对齐,把注释对齐,把变量名、标号等自定义标志符对齐,这是良好的编程习惯。
(二)表达式
由操作数和运算式组成,在汇编时一个表达式得到一个值。
1.操作数可能是数据,也可以是存储单元的地址。
2.运算符包括:
1)算术运算符+、-、*、/、MOD(取余)如:
19/7=219MOD7=5
2)逻辑运算符AND(与)、OR(或)、XOR(异或)、NOT(非)
3)关系运算符EQ(相等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)、NE(不等于)
参与关系元算的两个操作数必须都是数据,或者是同一段中的存储器单元地址,而结果总是一个数值。
如果关系式不成立,则在汇编时,此数值为0;如果关系式成立,则返回0FFFFH。
如:
MOVAX,LT5
若PORT<5则等价于MOVAX,0FFFFH,否则等价于MOVAX,0
4)分析运算符对存储器地址进行运算。
有5个:
①SEG求存储单元的段地址。
格式为:
SEG变量或标号名
如:
已知数据段从存储器的23000H地址开始,DBUF是该段中的一个变量名。
MOVBX,SEGDBUF汇编为:
MOVBX,2300H
②OFFSET取地址的段内偏移量。
格式为:
OFFSET变量或标号名
③TYPE求出存储器操作数的类型,格式为:
TYPE变量或标号
对于变量,汇编程序将求出该变量的类型:
DB为1,DW为2,DD为4,DQ为8,DT为10。
对于标号,汇编程序则将求出代表该标号类型的数值:
NEAR为-1,FAR为-2。
④LENGTH求出数组包含变量的个数,格式为:
LENGTH变量
此运算符只适用于DUP定义变量的情况,汇编程序求出分配给该变量的数据个数。
其他情况则为1。
⑤SIZESIZE求出数组包含变量的总字节数,格式为:
SIZE变量
此运算符只适用于DUP定义变量的情况,汇编程序求出分配给该变量的字节数。
对于DUP括号内为单个数据项时,此值是LENGTH值和TYPE值的乘积。
5)综合运算符用来为存储器地址操作数建立一个新的属性,而忽略当前的属性,所以又称为属性修改运算符。
有6个综合运算符:
PTR、段属性前缀、SHORT、THIS、HIGH和LOW。
①PTR定义新的类型属性,格式为:
类型PTR地址表达式
格式中的类型可以是BYTE、WORD、DWORD、NEAR、FAR等,地址表达式可以是标号、作为地址指针的寄存器、变量和数值的组合。
如果地址表达式指定了一个存储器单元,它的类型已被定义,再运行PTR运算符,将把一种新的类型赋予此地址表达式,使其对应的地址又具有另一种类型属性。
例:
已定义数据如下:
DA1DW1234H;DA1的类型是WORD(TYPEDA1=2)
为DA1单元开始的两个字节赋予新类型的定义如下:
DA2EQUBYTEPTRDA1;DA2的类型是BYTE(TYPEDA2=1)
DA3EQUBYTEPTRDA1+1;DA3的类型是BYTE(TYPEDA3=1)
此时DA1和DA2具有相同的段地址及偏移地址,但是他们的类型属性不同。
前者为字型,后者为字节型。
注意:
PTR只是用来建立一个符号地址,它本身并不分配存储器。
PTR运算符可以用来确定指令操作数的类型是字节型还是字型,以保证指令的正确使用。
例:
已知寄存器BX的内容是0120H,指令为MOV[BX],34H
执行指令时,汇编程序不能分清是把立即数34H存入偏移地址为0120H的单元,还是把立即数0034H存入偏移地址为0120H、0121H的单元,此时可以用PTR运算符来说明其属性,指令可改写为:
MOVBYTEPTR[BX],34H;将立即数34H存入偏移地址为0120H的单元
或MOVWORDPTR[BX],34H;将立即数0034H存入偏移地址为0120H、0121H的单元
②段属性前缀运算符“∶”用来表示一个标号、变量或地址表达式的段属性。
格式为:
段寄存器名∶地址表达式或段名∶地址表达式或组名∶地址表达式
例:
用段前缀指定附加段内操作数的地址
MOVAL,ES∶DATA;指令源操作数在附加段DATA地址单元中
③SHORT决定JMP指令中转移地址的属性,指定转移地址是在下一条指令地址的-128~+127字节范围之内。
例:
LT0∶……
LT1∶JMPSHORTLT3(LT0)
LT2∶MOVADDAH,BH
……
LT3∶……
转移指令以标号LT2为基准,当转向地址是LT3时,LT3与LT2之间的最大距离是+127;当转向地址是LT0时,LT0与LT2之间的最大距离是-128。
④THIS类似PTR,用于建立一个指定类型(BYTE、WORD或DWORD)或指定距离(NEAR或FAR)的地址操作数。
该操作数与当前所能分配的下一个存储单元的段地址和偏移地址相同。
格式为:
THIS类型
例:
DA2EQUTHISBYTE
DA1DW2400H
DA1和DA2的段地址和偏移地址相同,但是他们的类型不同:
TYPEDA1=2(字型)
TYPEDA2=1(字节型)
例:
LG1EQUTHISFAR
LG0∶MOVSI,3000H
……
JMPLG0
标号“LG0∶”(有“:
”)与标号“LG1”(无“:
”)都代表同一条指令的地址,区别是标号“LG0∶”是NEAR型的,可以供段内转移使用,标号“LG1”是FAR型的,可以供段间转移使用。
⑤LOW和HIGH用于对一个16位数据或地址表达式,用HIGH取其高位字节、LOW取其低位字节。
所以此运算符又称为字节分离运算符。
格式为:
LOW表达式或HIGH表达式
例:
已知RESULTEQU7788H
则MOVAH,HIGHRESULT汇编为:
MOVAH,77H
MOVAL,LOWRESULT汇编为:
MOVAL,88H
以上介绍了几种常用的运算符。
为了正确计算表达式的数值,应该按照运算符的优先级:
先高后低、自左向右(优先级相同时)地进行计算。
括号内的表达式应优先计算。
下面给出运算符(其中没有讲到的运算符可查有关资料)从高到低的优先级排列顺序:
①(在圆括号中的项),[方括号中的项],〈结构变量(变量、字段)〉
②LENGTH,SIZE、WIDTH和MASK
③PTR,OFFSET,SEG,TYPE,THIS及段运算符
④HIGH和LOW
⑤*,/,MOD,SHL(左移),SHR(右移)
⑥+,-
⑦EQ,NE,LT,LE,GT,GE
⑧NOT
⑨AND
⑩OR,XOR,SHORT
二、汇编语言的语句形式
汇编语言中,有两种语句:
指令性语句和指示性语句。
1)指令性指令在汇编后产生指令代码,在程序运行时由计算机执行。
2)指示性指令又称伪指令,不产生代码指令,计算机不执行,只是在汇编期间给汇编程序提供某些信息,如完成数据定义,分配存储区,指示程序结束等功能。
标号后不跟冒号,用于定义的变量名、过程名、常量名等。
三、汇编语言中的常用伪指令
1)数据定义与存储器分配伪指令DB、DW、DD、DQ、DT
DB定义字节,其后的每一个操作数都占一个字节;
DW定义一个字,其后的每一个操作数都占一个字(低位字节在低地址,高位在高地址);
DD定义一个双字,其后的每一个操作数都占4个字节;
DF用来定义3字(6个字节),可用来存放远地址。
这一伪指令只能用于386及其后继机型中。
DQ定义一个4字,其后的每一个操作数都占4个字空间;
DT定义一个BCD码数据,共10个字节。
其最高位字节用来表示正负号,其余9个字节,每个字节内含有二个BCD码,所以,一个BCD码数据可表示18个BCD编码。
书上为定义10个字,有误
例:
DATA1DB10,4
DATA2DW100
DATA3DD3*20,OFFCDH
源程序汇编时,将数据写入存储器。
另:
操作数也可以是字符串,如“HELLO”
可以是“?
”——保存存储空间,但不写入数据,还可以用DUP重复操作符,如NDUP(D)——数D重复N次;
例:
MES1DB“HELLO”
DATA1DB0,?
,5,?
DATA2DB3DUP(10),2DUP(1,2)如右图所示(图中少了一个4CH)
2)表达式赋值伪指令EQU
程序中,常有1个常数、常量或表达式使用频繁的情况,可用EQU语句给其赋一个名字,在程序中直接用这个名字,需要更改时,只须在此语句中更改即可,不须一一更改。
格式;符号名EQU表达式
例:
P8EQU256
IEQU7*WEIGHT
注:
EQU语句中如果有变量式标号的表达式,则在该语句前先定义,否则出错。
另:
表达式赋值也可以用“=”。
例:
P8=256
区别:
EQU赋值后(相当于定义一个常量),不可以改值,
而等号赋值后(相当于定义一个变量),则可以重新定义其值。
另:
解除定义伪指令PURGE格式:
PURGE符号1,符号2,…,符号N
功能:
解除指定符号的定义。
解除符号定义后,可用EQU重新进行定义。
如:
Y1EQU7;定义Y1的值为7
PURGEY1;解除Y1的定义
Y1EQU36;重新定义Y1的值为36
3)段定义伪操作
格式:
段名SEGMENT
……
段名ENDS
成对使用,定义一个段,但并未指明定义的段作什么段使用,必须用ASSUME来分配。
格式;ASSUME段寄存器名:
段名,段寄存器名:
段名---
例:
D1SEGMENT
---
D1ENDS
D2SEGMENT
---
D2ENDS
D3SEGMENT
ASSUMECS:
D3,DS:
D1,ES:
D2
---
D3ENDS
说明:
D3段做代码段,D1为数据段,D2为附加数据段;
注:
ASSUME指令必须放于代码段中,否则出错。
ASSUME只指定段和段寄存器之间的关系,并将代码段的基扯自动装入到CS寄存器中;但未将其它段的基扯装入到对应段寄存器中,所以还需要一段初始化程序完成这一工作。
指令如下;
D1SEGMENT
XDB5
D1ENDS
DESEGMENT
ASSUMECS:
DE,DS:
D1;必须在代码段中
MOVAX,D1
MOVDS,AX
MOVAX,DE;不需要,程序初始化时自动完成,但其它段必须有
MOVCS,AX
---
DEENDS
常用ORG指令来规定段的起始地址(放在段的内部)。
ORG后的指令或数据就从该地址起。
例:
DATA1SEGMENT
---
DATA1ENDS
DATA2SEGMENT
ORG0100H
---
DATA2ENDS
则DATA1从0000H开始,DATA2从0100H开始。
4)子程序定义伪指令
格式:
程序名PROCFAR/NEAR
---
RET
程序名ENDP
子程序中,最后一条指令一般是RET指令,返回主程序;
若无属性,则默认为NEAR属性。
5)程序结束伪操作END
格式:
END[标号]
表示程序结束。
汇编程序遇到END语句时,结束汇编,后面的语句将被忽略。
标号指向第一条指令,如果用多个模块连接,则只在主程序中用标号,子模块中只用END。
例:
试编程序求数OPR1与OPR2之和的绝对值,结果保存在RESULT单元。
DATASEGMENT
OPR1DW?
OPR2DW?
RESULTDW?
DATAENDS
STACKSEGMENT
BUFDW50DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
ORG200H
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,OPR1
ADDAX,OPR2
JGESTORE
NEGAX
STORE:
MOVRESULT,AX
RET
CODEENDS
ENDSTART
第二节汇编语言程序的上机过程
一、汇编程序的作用
汇编语言是助记符,标号,符号等符号语言,写成源文件后,不能由CPU执行,必须经过汇编程序翻译成机器语言,生成二进制代码文件*.OBJ,汇编过程中,汇编程序可指出源程序中的错误。
*.OBJ是二进制文件,也不能直接运行,必须经过连接,将目标文件与库文件,其他目标文件连接文件生成可执行文件*.EXE。
编辑程序——*.ASM——汇编程序——*.OBJ——连接程序——*.EXE
源程序目标文件可执行文件
汇编程序的功能是对ASM文件进行汇编并产生三个文件:
一是二进制目标文件OBJ,此文件中的地址还是浮动的,不能直接运行,需要在连接过程中定位;二是列表文件LST,它是可打印文件,列出源程序语句行号、地址和机器码的对照清单,并给出符号表,以利于程序的调试;三是CRF文件,它将建立交叉引用表,提供源程序中各种符号的定义与引用情况。
连接程序的功能是把OBJ文件转换为可执行的EXE文件。
它主要解决汇编语言源程序中的符号地址问题,将浮动的相对地址变为绝对地址,形成可执行的EXE文件,就可以在DOS状态下运行。
同时生成MAP文件,它是连接程序的列表文件,提供每个段在存储器中的分配情况。
二、上机过程
由上述流程可知,为运行汇编语言程序至少需要下列文件:
QE.COM/EDIT.COM………………………用于编辑源程序,也可以用TC或WINDOWS下的记事本等。
但必须以.ASM后缀。
ASM.EXE或MASM.EXE………………汇编程序ASM.EXE不支持宏汇编,
LINK.EXE………………………………连接程序.
另外,可有以下辅助程序:
DEBUG.COM……………………………调试工具
EXE2BIN.EXE…………………………将EXE文件转换为.COM文件,也是一种可执行文件
步骤:
1)建立源文件
用各种文本编辑软件编写源文件,但必须用*.ASM为后缀,不能是WORD等格式。
2)用ASM或(MASM.EXE)产生目标文件.
例:
C:
>ASMMY.ASM回车
则显示以下内容:
版本号(略)
OBJECTFILENAME[MY.OBJ]——目标文件名,必须有,可回车生成MY。
OBJ或输入新的目标文件名后回车。
SOURCELISTING[NUL.LST]——LST文件即列表文件,列出源程序与目标机器语言清单,给出符号表,可有可无,不要则回车确认.
CROSSREFERENCE[NUL.CRF]用于产生交叉引用表;一般不要可回车跳过.
WARRINGERRORS---警告错误
SEVEREERRORS----严重错误;一般在其后给出错误行号与错误类型.
3)用LINK文件产生*.EXE文件
C:
>LINKMY.OBJ
版本号
RUNFILE[MY.EXE]:
——可执行文件名可回车默认MY.EXE也可以回车.
LBTFILE[NUL.MAP]:
——列表文件,给出每个段在存储器中的分配情况,不要则回车
LIBRARIES[.LIB]:
——程序运行所须的库文件,一般没有,回车跳过.
WARNING:
NOSTACKSEGMENT:
——程序中如无定义堆栈段,会出现此情况,不影响程序运行.
THEREWASNERRORSDETECTED:
连接时发现N个错误.
4)程序执行
C:
>MY回车
注:
①第二步,第三步时可直接在文件名后加”;”.以默认以下各项,不用一一回车。
②若第二步有错误,应不执行第二步,而是先修改源程序.
③执行程序时不要输入.EXE等后缀.
附:
DEBUG使用(划波浪线者为较常用命令):
1、打DEBUG进入DEBUG,显示提示符'-'。
2、退出DEBUG命令:
Q
3、显示内存命令:
D起始地址结束地址
4、修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5、检查寄存器命令:
R
标志位10
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
6、修改寄存器命令:
R寄存器名
7、小汇编命令:
A起始地址,不输入指令打回车键退出A命令。
8、反汇编命令:
U起始地址结束地址
9、文件命名命令:
N盘号:
文件名
10、读文件命令:
L内存地址
11、写文件命令:
W内存地址
10、读扇区命令:
L内存地址盘号(0--A:
1--B:
)扇区号扇区数
11、写扇区命令:
W内存地址盘号扇区号扇区数
12、运行命令:
G=起始地址结束(断点)地址
13、单步命令:
T=起始地址运行指令数,进入子程序内部。
14、单步命令:
P=起始地址运行指令数,不进入子程序内部。
15、内存搬家命令:
M起始地址结束地址目的地址
;例:
本程序用于传送20B的字符串,程序保存为MoveData.asm
DATASEGMENT
DATAXDB'ABCDEFGHIJKLMNOPQRST'
DATAYDB20DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
CLD
MOVCX,20
MOVSI,OFFSETDATAX
MOVDI,OFFSETDATAY
REPMOVSB
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
C:
\MASM5>masmmovedata
Microsoft(R)MacroAsse
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 汇编语言程序设计 汇编语言 程序设计