汇编语言程序设计41~45节_第1页
汇编语言程序设计41~45节_第2页
汇编语言程序设计41~45节_第3页
汇编语言程序设计41~45节_第4页
汇编语言程序设计41~45节_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章汇编语言程序设计4.1.1汇编语句的种类和格式汇编语句可分为两种,一种是指令语句,另一种是伪指令语句。汇编程序在对源程序进行汇编时,把指令语句翻译成对应的机器指令,而伪指令被汇编程序直接执行。指令语句的格式:

[标号:]指令助记符[操作数[,操作数]][;注释]伪指令语句的格式:

[名字]伪指令助记符[操作数[,操作数]][;注释]4.1

汇编语言程序设计概述分析问题,弄清楚问题的性质、目的、已知数据、运算精度以及速度等方面的要求。确定算法,把实际问题转化为计算机求解的步骤和方法。绘制程序流程图。根据流程图编写程序。进行静态检查。上机调试。4.1.2汇编语言程序设计一般步骤在汇编语言程序中,有以下四种基本结构:顺序程序分支程序循环程序子程序这几种程序的设计方法是汇编语言程序设计的基础。4.1.3汇编语言程序的基本结构1.常量常量是指那些在汇编源程序翻译成目标程序期间已经有确定数值的量,可分为数值常量和符号常量。2.数值表达式由常量、符号常量以及运算符组成,其运算结果为数值常量。汇编语言允许对常量进行三种类型的运算:算术运算、逻辑运算、关系运算。(1)算术运算符算术运算包括:加(+)、减(-)、乘(*)、除(/)、模除(MOD)。其中,模除(MOD)表示两整数相除后取余数。

4.2.1数值表达式

4.2汇编语言的表达式例4-1已知符号常量NUM=51,求下列指令的汇编结果(表达式的值):MOVAX,NUM/9MOVAX,NUMMOD9MOVAX,NUM*5汇编的结果是:MOVAX,5MOVAX,6MOVAX,255

4.2.1数值表达式

(2)逻辑运算符和移位运算符逻辑运算包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)和逻辑非(NOT)。逻辑运算是按位进行的。移位运算包括:右移(SHR)和左移(SHL),表示将二进制常量右移或左移运算符右边所规定的位数,所空出的位均补0。

4.2.1数值表达式例4-2求下列指令汇编的结果。MOVAL,4CHSHL2MOVAL,NOT0FFHANDAL,4CHAND0F0HXORAL,4CHXOR0FFH汇编的结果是:MOVAL,30HMOVAL,0ANDAL,40HXORAL,0B3H

4.2.1数值表达式(3)关系运算符关系运算包括:相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)和大于等于(GE)。它们的运算结果是两个特殊的常量,若关系不成立,结果为0;否则结果为0FFH或0FFFFH。

4.2.1数值表达式例4-3求下列指令汇编的结果。MOVAL,4CHEQ2MOVAL,4CHGT1汇编的结果是:MOVAL,0MOVAL,0FFH

4.2.1数值表达式

4.2.1数值表达式3.变量

变量是一个数据存储单元的名字,即数据存放单元地址的符号表示。变量由4.3节介绍的数据定义伪指令定义,也可以用LABEL或EQU伪指令来定义,一般在除代码段以外的其它段中定义。由于主存是分段使用的,所定义的变量体现出以下三种属性:(1)段属性。(2)偏移属性。(3)类型属性。

4.2.1数值表达式4.标号

标号是机器指令语句存放单元地址的符号表示,也可以是过程名。标号在代码段中定义,用于机器指令之前,并用冒号“:”作为分隔符,它也可以用LABEL或EQU伪指令来定义。由于标号代表了指令的符号地址,因此它也有三个属性:(1)段属性。(2)偏移属性。(3)类型属性。地址表达式是由变量、标号、常量、寄存器(BP、BX、SI、DI)间址的内容(用寄存器名加方括号表示)和运算符组成。地址表达式的值一般是偏移地址具有段、偏移地址及类型三个属性。地址表达式的运算符可以使用数值表达式的运算符,也可以使用属性运算符和数值回送操作符。

4.2.2地址表达式1.数值回送操作符①取类型算符TYPE格式为:TYPE变量或标号如果TYPE后面跟的是变量,则汇编程序将回送该变量类型的字节数:字节类型为1,字类型为2,双字类型为4,4字类型为8,10字节类型为10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR型为-1(0FFFFH),FAR型为-2(0FFFEH)。

4.2.2地址表达式②取变量所含的数据存储单元个数算符LENGTH格式为:LENGTH变量返回利用DUP定义的数组中元素的个数,即重复操作符DUP前的整数n值。如果变量定义语句中没有使用DUP,则返回1。如果嵌套使用了DUP,则只返回最外层的重复数。

4.2.2地址表达式③取变量所含的数据存储区大小算符SIZE格式为:SIZE变量它的取值为该变量所占数据存储区的字节数。SIZE算符与LENGTH算符的关系是:LENGTH变量×TYPE变量,即等于上述两种算符取值的乘积。

4.2.2地址表达式④取偏移地址算符OFFSET格式为:OFFSET变量或标号它的取值为其后变量或标号的偏移地址。⑤取段地址算符SEG格式为:SEG变量或标号它的取值为其后变量或标号所在段的段地址。

4.2.2地址表达式2.属性操作符①类型运算符PTR格式为:类型PTR地址表达式其中类型字段表示所赋予的新的类型属性,对于变量可以是BYTE、WORD、DWORD,对于标号可以是NEAR、FAR。例如指令:MOV[BX],0FFH两操作数类型均不明确,应写成:MOV[BX],WORDPTR0FFH

4.2.2地址表达式②段操作符“:”格式为:段寄存器名:地址表达式或:段名:地址表达式③短转移算符SHORT例如:JMPSHORTTAG④定义类型算符THIS格式为:THIS类型⑤字节分离算符HIGH和LOW格式为:HIGH/LOW常量或地址表达式

4.2.2地址表达式运算符的优先级别,从高到低排列如下:①括号的项。②LENGTH,SIZE。③PTR,OFFSET,SEG,TYPE,THIS及段操作符“:”④HIGH,LOW⑤*,/,MOD,SHL,SHR⑥+,-⑦EQ,NE,LT,LE,GT,GE。⑧逻辑运算:NOT,AND,OR,XOR。⑨SHORT。

4.2.2地址表达式4.3.1数据定义的伪指令

语句格式:[变量名]数据定义伪指令表达式1[,表达式2,...][;注释]功能:定义一数据存储区,其类型由所使用的数据定义伪指令指定。变量名是可选的,需要时由用户自己命名。它是该数据区的符号地址,也是其中第一个数据项的偏移地址。程序可以通过变量名引用其中的数据。常用的数据定义伪指令有DB(字节)、DW(字)、DD(双字)、DQ(8字节)、DT(10字节)。

4.3伪指令例4-4画出以下数据定义伪指令定义的数据存储形式。CRDB0DHLFDB0AHDATADW100,100H,-5语句格式:符号名EQU表达式功能:用来为常量、表达式以及其它各种符号定义一个等价的符号名,但它并不申请分配存储单元。1.等价伪指令

4.3.2符号定义的伪指令

用法①:定义一个常量符号。例如:用EQU定义的符号常量:AEQU5BEQUA*3+2用法②:与特殊运算符PTR或THIS连用,可以给变量或标号定义新的类型属性并重新命名,但其段属性和偏移地址属性不变。例4-5某程序的数据段中有如下几条伪指令语句,试分析各变量的属性。DATA SEGMENTDDBUF EQUTHISDWORDBUF DB100DUP(?)DWBUF EQUWORDPTRBUFDATA ENDS...FIRSTEQUTHISFAR

4.3.2符号定义的伪指令

用法③:为较复杂的表达式及源程序中的任何符号定义一个替换名。例如:MOVEEUQMOVCOUNTEUQCXSUM(X,Y)EUQX+Y则下列指令等价于:MOVEAX,BX;等价于:MOVAX,BXMOVCOUNT,100;等价于:MOVCX,100ADDAX,SUM(30,50);等价于:ADDAX,80

4.3.2符号定义的伪指令

语句格式:符号名=表达式功能:该语句的功能与EQU语句类似,但有一个区别:EQU不能重复定义符号名,而等号语句能对所定义的符号名再重新定义,给它赋予新的值。同一符号多次定义时,以最后一次定义的值为准。2.等号伪指令

4.3.2符号定义的伪指令

语句格式:变量名或标号LABEL类型功能:为当前存储单元定义一个指定类型的变量或标号。它的功能与语句“变量名或标号EQUTHIS类型”的功能相似。3.定义符号伪指令

4.3.2符号定义的伪指令

语句格式:ORG数值表达式功能:将汇编地址计数器设置成数值表达式的值。例4-6指出下列程序段中变量BUF和NUM的偏移地址是多少?ORG10;设置$的值为10

BUFDB‘ABCD’;变量BUF的偏移地址为10ORG$+5;$的值增加5NUMDW50;NUM的偏移地址为191.置汇编地址计数器伪指令ORG

4.3.3其它功能伪指令

偶地址伪指令EVEN的功能是把地址计数器调整为偶数。在汇编数据定义语句或指令语句时,如地址计数器现行位置为奇数,则在汇编的目标代码中自动插入一条无操作指令NOP,如地址计数器已为偶数,那么汇编程序不作任何操作。EVEN伪指令的使用格式为:

EVEN2.偶地址伪指令EVEN

4.3.3其它功能伪指令

INCLUDE伪指令把指定的文件插入正在汇编的源程序中,作为源程序的一个组成部分。INCLUDE伪指令的使用格式为:INCLUDE源程序文件名3.INCLUDE伪指令

4.3.3其它功能伪指令

PUBLIC伪指令用于定义全局符号,包括标号、FAR类型的过程名、变量名、常数名等。PUBLIC伪指令的使用格式为:

PUBLIC符号1,符号2,……4.PUBLIC伪指令

4.3.3其它功能伪指令

EXTRN伪指令用于告诉汇编程序,本语句说明的这些符号没有在本程序模块中定义,是由其它程序模块定义的,且在定义模块中用PUBLIC伪指令说明。EXTRN伪指令的使用格式为:

EXTRN符号1:类型,符号2:类型,……5.EXTRN伪指令

4.3.3其它功能伪指令

TITLE伪指令是给程序指定一个标题,以便在列表文件中每一页的第二行都显示这个标题文本。TITLE伪指令使用格式为:TITLE文本6.TITLE伪指令

4.3.3其它功能伪指令

4.3.4汇编语言程序结构例4-7编程实现123+456→SUM单元的功能。要求使用﹒EXE文件结构。汇编源程序1:STSGSEGMENTSTACK‘S’;行1DW32DUP(?);行2STSGENDS;行3DATASEGMENT;行4ADW123;行5BDW456;行6SUMDW?;行7DATAENDS;行8CODESEGMENT;行9MAINPROCFAR;行10ASSUMECS:CODE,DS:DATA,SS:STSG;行11PUSHDS ;行12XORAX,AX ;行13PUSHAX;行14MOVAX,DATA;行15MOVDS,AX ;行16

4.3.4汇编语言程序结构MOVAX,A;行17ADDAX,B ;行18MOVSUM,AX ;行19RET ;行20MAINENDP ;行21CODEENDS;行22ENDMAIN;行234.3.4汇编语言程序结构语句格式:段名SEGMENT[定位方式][组合方式][‘类别’]...段名ENDS功能:定义一个以SEGMENT伪指令开始,以ENDS伪指令结束,以“段名”命名的存储器段。

1.段定义伪指令

4.3.4汇编语言程序结构语句格式:ASSUME段寄存器:段名[,段寄存器:段名...]功能:该语句一般出现在代码段中,且在段的开始出现,用来设定段寄存器与段之间的对应关系。在程序中使用这条语句的话,宏汇编程序就将这些段作为当前可访问的段处理。2.ASSUME伪指令

4.3.4汇编语言程序结构语句格式:过程名PROC属性

...

过程名ENDP过程名是子程序入口的符号地址,可以是任意合法的字符串。属性有近属性(NEAR)和远属性(FAR),段内调用的过程使用NEAR属性,段间调用的过程使用FAR属性。过程是程序的一部分,通常也叫子程序。一个过程可以被其它程序调用,它的最后一条语句总是返回指令。过程调用和返回指令可用CALL和RET指令。

3.过程定义伪指令

4.3.4汇编语言程序结构语句格式:END<表达式>源程序结束伪指令是源程序的结束标志,汇编程序汇编到该伪指令结束,通常为源程序的最后一条语句。其中表达式为可选项。表达式必须为一存储器地址,该地址为程序的启动地址,即该程序在计算机上运行时第一条被执行指令的地址。如果不带表达式,表明该程序模块不能单独运行,而作为子模块让其它程序调用。4.程序结束伪指令

4.3.4汇编语言程序结构初始化后,DS和ES并没有指向用户自己的数据区,而是指向PSP的段基址。但在用户程序运行过程中,DS应指向用户程序自己的数据段以便访问其中的内容,例如上例中访问A、B和SUM变量。同理,ES也应设置为正确的位置。所以,编程人员应在程序中用指令为DS和ES寄存器赋值。因为立即数不能直接传送段寄存器,所以用以下语句为DS赋值:MOVAX,DATAMOVDS,AX如果程序中用到了附加段,也要在程序中用同样的方法为它们赋值。

5.

段寄存器的装填4.3.4汇编语言程序结构6程序返回操作系统(1)利用PSP中的INT20H返回DOSMAINPROCFAR…PUSHDS

XORAX,AX

PUSHAX

…RETMAINEND4.3.4汇编语言程序结构(2)利用DOS的4CH系统功能调用返回DOS目前返回DOS通常使用4CH系统功能调用,这种方法实现起来比较简单,可用以下语句实现:MOVAH,4CHINT21H4.3.4汇编语言程序结构源程序2:STSGSEGMENTSTACK‘S’DW32DUP(?)STSGENDSDATASEGMENTADW123BDW456SUMDW?DATAENDS4.3.4汇编语言程序结构CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STSGSTART:MOVAX,DATA

MOVDS,AXMOVAX,AADDAX,BMOVSUM,AXMOVAH,4CHINT21HCODEENDSENDSTART4.3.4汇编语言程序结构

4.4.1

宏定义定义格式:宏指令名MACRO形式参数[,形式参数,...]

宏体

ENDM例如:ADD3MACROX,Y,ZADDX,YADDX,ZENDM4.4宏指令

4.4.2

宏调用宏调用的格式:宏指令名<实参1,实参2,...>注意宏指令的参数没有类型,只是一种符号替换,如果替换后的语句有错误,则宏扩展时系统会给出提示。4.4.3宏扩展宏扩展由汇编程序在汇编的过程中在宏调用的地方用宏体代替宏指令,实参代替形参。例如:已定义了宏指令ADD3,在源程序中进行如下调用:ADD3AX,BX,CX宏扩展后的形式为:+ADDAX,BX+ADDAX,CX符号“+”用于标志宏扩展的语句。4.4.4宏定义与宏调用中的参数1.带间隔符的实参在宏调用中,有时实参是一串带间隔符(如空格、逗号等)的字符串,为了不至于混淆,应用尖括号将它们括起来,作为一个实参。例如:STACK0<500DUP(0)>,尖括号的内容为一个实参。2.数字参数

在某些情况下,需要以实参的值而不是符号本身代替形参,这种参数的替换称为数字参数的替换。特殊宏操作符%用来将其后的表达式转换成它所代表的数值,并将此数值的ASCII码字符嵌入到宏扩展中。4.4.4宏定义与宏调用中的参数3.宏体中的变量与标号在某些宏定义中,常常需要定义一些变量或标号,当这些宏定义在同一程序中多次调用并进行宏扩展后,就会出现变量或标号重复定义的错误。为了解决这个问题,8086宏汇编语言提供了伪指令LOCAL。语句格式:LOCAL标号和变量表功能:在宏扩展时,宏汇编程序自动将用LOCAL说明的变量或标号表示为唯一的特殊符号(??0000~??FFFFH),从而避免了符号重复定义的错误。LOCAL语句只能作为宏体的第一条语句,它后面即为宏定义的变量和标号表。

4.5.1概述4.5系统功能调用图4-2系统功能调用过程

4.5.2常用的输入/输出系统功能调用1.键盘输入(1号调用)

调用格式:

MOVAH,1 INT21H功能:等待从键盘输入一个字符并将输入字符的ASCII码送入寄存器AL中。2.显示输出(2号调用)

调用格式:

MOVDL,待显示字符的ASCII码

MOVAH,2 INT21H功能:将DL中的字符送显示器显示,若DL中为<CTRL>+<Break>的ASCII码,则从本调用的执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论