第3章 常用伪指令与汇编语言程序设计(1)-伪指令与源程序结构_第1页
第3章 常用伪指令与汇编语言程序设计(1)-伪指令与源程序结构_第2页
第3章 常用伪指令与汇编语言程序设计(1)-伪指令与源程序结构_第3页
第3章 常用伪指令与汇编语言程序设计(1)-伪指令与源程序结构_第4页
第3章 常用伪指令与汇编语言程序设计(1)-伪指令与源程序结构_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第3章汇编伪指令与汇编语言程序设计这部分内容,教材分散到第2章、第3章GLUT_C2013-08JCB13.1汇编语言中的标记、表达式和伪指令3.1.1汇编语言概况由汇编程序执行的汇编过程GLUT_C2013-08JCB2汇编语言——用指令助记符来表示机器语言。汇编语言编写的程序——源程序。汇编语言中的指令与机器指令之间具有一一对应的关系。经过汇编后,得到目标代码。汇编语言是面向机器的语言。它的优点——直接面向机器,硬件操作能力强,目标代码小,执行效率高。缺点:与其它高级语言相比较,程序阅读、理解相对困难,可移植性差。下面看一段汇编语言程序例子GLUT_C2013-08JCB3DATA SEGMENT ;数据段定义开始

DAIDB ‘INPUTSTRING:$’BUFDMADB 80H DUP(?)DATA ENDS ;数据段定义结束STACK SEGMENT ;堆栈段定义开始

ME1DB 80H DUP(?)STACK ENDS ;堆栈段定义结束CODE SEGMENT

;代码段定义开始

ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSETMEI MOV AH,09H INT 21H MOV DX,OFFSETBUFDMA MOV AH,0AH INT 21HCODE ENDS ;代码段定义结束END ;程序结束程序

例GLUT_C2013-08JCB43.1.2汇编语言指令的书写格式及标识符1.指令书写格式标号:指令助记符操作数,(操作数)

;注释(1)标号:又叫标识符。为可选项,它在指令助记符前,以“:”结尾。标号是该指令在内存中存放的符号地址,转移指令,过程调用指令通常使用该标号来作为目的地址。一个程序段的开头、一个数据段的开头一般会给出标识符。子程序第一条指令、转移程序的转移目的需要给出标识符。GLUT_C2013-08JCB5①标号由英文字母、数字、特殊字符:“_”,“@”,“?”,“$”等组成,但应注意:第一个符号不能是数字;

“@”、“?”特殊字符不能单独做标号。保留字不能作为标号使用。所谓保留字,就是所有的指令,伪指令以及汇编语言定义的特殊符号,例如ADD、LJMP、DB等。GLUT_C2013-08JCB6②标号不是每一条指令都必须的,只有需要时,指令前面才加标号。所谓需要,就是转移指令的目的地址,或过程(子程序)的第一条指令,或其它目的。③标号的长度:不超过31位。GLUT_C2013-08JCB7例如:STARTMY_CODEXABCD1?001L004ABC@ MOVDATA都是有效的标号GLUT_C2013-08JCB8而以下这些标号

4ABC

第一个字符是数字

MAIN!使用了非法字符!

STR=6

使用了非法字符=A/B

使用了非法字符/?

问号不能单独作标号使用

MOV

使用了保留字MOV

都是无效的标号。保留字是指整个字符串,如果字符串中只有部分字符与保留字相同则没关系例如:A_MOV_BAND123等,都是有效标号。GLUT_C2013-08JCB9(2)指令助记符和操作数前面学过。GLUT_C2013-08JCB10(3)注释是可选项,它主要是为了增加程序的可读与可理解性,注释部分不影响程序的执行。注释部分以“;”号开始,可以使用任何符号。一行写不下,可以使用多行,凡是“;”后面的,都是注释。注释放在一段程序之前,对这段程序进行说明。或者放在指令之后,对这条指令执行的作用进行说明。GLUT_C2013-08JCB11

DATASEGMENT

;数据段定义开始

DA1 DB‘Thisisasampleprogram’DB0DH,0AH,’$’

DATAEMDS

;数据段定义结束

STACKSEGMENT

;堆栈段定义开始

ST1DB100DUB(?);定义100个字节

STACKENDS

GLUT_C2013-08JCB12CODESEGMENT

;代码段定义开始MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACK;;代码段开始,该段程序的功能是……; ORG1000

START:PUSHDS ;程序代码开始

MOVAX,0 ……MAINEMDP ;代码结束

CODEENDS

;代码段定义结束

ENDSTART ;程序结束GLUT_C2013-08JCB132保留字汇编语言中用到的,不能给用户随意定义为其它功能的字符和字符串。例如:全部的指令助记符,寄存器名伪指令符号表达式符号等。GLUT_C2013-08JCB143.分界符汇编语言程序设计中,作为程序,或一条指令中两个部分的分隔符用。例如两个操作数之间的分隔符,标号的分隔符 注释的分隔符GLUT_C2013-08JCB154.常数在指令中,它就是立即数。可以使用各种数制,注意不同数制的表示方式。如果是字符串,需要用单引号括起来,例如‘ABCD’它表示包含4个字符的字符转,分别用每个字符的ASCII码存放41H,42H,43H,44H‘1234’表示的是字符串,存放31H,32H,33H,34HGLUT_C2013-08JCB165表达式(1).表达式的组成:操作数和运算符。(2).操作数:可以代表一个数据,也可以代表一个地址。逻辑运算符关系运算符分析运算符综合运算符GLUT_C2013-08JCB176.运算符(1)算术运算符包括+;-;*;/;取模运算MOD算术运算符、数据构成算术表达式,算术表达式与算术运算指令有区别——算术表达式在汇编时求出表达式的值,作为指令中的一个操作数。

——算术指令是在程序运行时执行取模运算MOD——两数相除,取它的余数。例如:20MOD7结果为?655MOD6=1GLUT_C2013-08JCB18(2)逻辑运算符包括:与(AND);或(OR),非(NOT),异或(XOR)注:只能对常数进行,结果也是常数他与指令的逻辑运算有区别——该运算符在汇编时进行计算,而指令实在程序执行过程中进行运算。例如ANDAX,00FFH ANDDX,PORTAND0FEH逻辑表达式,汇编时计算出结果逻辑指令,程序执行时起作用GLUT_C2013-08JCB19(3)关系运算符两个操作数的关系相等EQ,不等NE,小于LT,大于GT,小于或等于LE,大于或等于GE。参与运算的两个操作数必须都是数据,或者是同一段存储单元的地址;结果是数据,关系成立,结果等于0FFFFH, 或0FFFFFFFFH

如果关系不成立,结果等于0例如: MOVBX,PORTLT3如果确实PORT<3,则汇编后,得到的代码相当于指令MOVBX,0FFFFHGLUT_C2013-08JCB20反之,如果关系不成立,汇编后的机器代码相当于MOVBX,0关系运算符往往和逻辑运算符组合使用。例如MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)如果是32位寄存器,结果0,或0FFFFFFFFHGLUT_C2013-08JCB21(4).分析运算符将存储单元的地址分解为段码和偏移值。OFFSET——取偏移地址例如MOVDX,OFFSETDATSEG——取存储单元的段码(段基址)例如:MOVAX,SEGABC MOVDS,AX ……TYPE——SIZE——LENGTH——GLUT_C2013-08JCB22(5).综合运算符主要要求掌握PTR——与BYTE,WORD,DWORD合用,定义存储单元的类型。MOVBYTEPRT[1000],12HMOVWORDPTR[1000H],12HGLUT_C2013-08JCB233.1.3语句汇编语言程序有一系列语句有序构成。两种语句指令性语句就是一条指令。例如MOVAX,1234HADDAX,BX

指示性语句不产生机器指令代码的语句,又叫伪指令语句。ABCDB50H,35HSEGMENTCODE等GLUT_C2013-08JCB24它们的区别:指令性语句对应着一条机器指令,汇编后会产生对应的机器指令代码指示性语句只为汇编过程提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。指示性语句使用标号时,标号后不用冒号分隔符。最本质的区别:是否产生目标代码。GLUT_C2013-08JCB253.2伪指令最常用的伪指令有:CPU定义.586/.586P·标号赋值EQU;·定义存储单元DB、DW、DD、DQ、DT;·定义存储类型BYTE、WORD、DWORD;·段定义位指令SEGMENT、ENDS、ASSUME和ORG;简约段定义位指令DATA、STACK、CODE·过程定义PROC、ENDP、NEAR、FAR;·程序结束ENDGLUT_C2013-08JCB26默认为8086,如果不是,则需要定义。例如.386.586.586P3.2.1确定CPU的伪指令GLUT_C2013-08JCB273.2.2.标号赋值伪指令EQU定义标号或符号常数

比如:

ABC EQU220 XYZ EQUABC程序设计中,对一些端口,或常数,一般会定义一个符号常数,然后再源程序设计中使用符号常数。例如COM1EQU3F8HCOM2EQU2F8HLPTEQU378HGLUT_C2013-08JCB28DB、DW、DD(2字)、DQ(4字既8字节)、DT(10字节)

比如:

COUNT1 DT ?

相当于语句

COUNT1 DB 10DUP(?)3.2.3定义存储单元的伪指令GLUT_C2013-08JCB291.字节定义伪指令DB(1)格式:

[名称]DB<数据表>注意:方括号[]中的内容表示是可选项,(2)功能:定义字节型数据,数据表中的每个数据占据一个字节单元,从“名称”给出的符号地址开始存放,具体在内存中的存放地址由汇编程序安排。GLUT_C2013-08JCB30例:

CR DB 0DH LF DB 0AH BUF_DIS DB ? ;预留一字节,不初始化

DO_2 DB 9DUP(?) DONT DW 10DUP(?) TABLE DB 00,01,03,02,06,04,05,07 DB 0FH,0EH,0CH,0DH,09 DB0BH,0AH,08GLUT_C2013-08JCB31例如:DATDB02,01,03,04,05DB06,

?,08,09,10注1:名称与DB之间留有至少一个空格,DB与第一个数据之间也要至少有一个空格,数据表中的个数据之间用“,”号隔开,一行的最后一个数据后面不能有“,”号。可以使用多行。数据按顺序存放。?号表示只保留存储单元,不定义初始化值02DAT010304050608090A?对应的字节GLUT_C2013-08JCB32注2:

如果数据列表中的数据使用单引号括起来的一个字符串例如STDB‘AB123’它表示定义一个字符串。该字符串中的每个字符用它对应的ASCII码表示,并将其按顺序存放在以符号地址ST开始的存储空间中

41ST42312233

每个字符占一个字节,用个字符的ASCII码作为字符的值GLUT_C2013-08JCB33注3:

DUP表示重复例:DO_2 DB 9DUP(?)表示连续定义9个字节数据,均不初始化--DO_2----------------050505----DO_3DO_3 DB3DUP(5)连续定义3个字节数据,初始化为5GLUT_C2013-08JCB34用DB定义的变量,在程序设计时,如果要取变量的值,可以直接写出变量,汇编程序汇编时,能够确定是从变量存放的存储空间取数据,而不是立即寻址的立即数。例如:计算有三个元素的数组Z=X+YDATASEGMMENTDATAX DB34H,56H,78HY DB01H,09H,06HZ DB3DUP(?) ;DATAENDSCODESEGMENTSTART:MOV AX,DATA ;取段开始地址

MOV DS,AX ;开始地址送数据段基址寄存器DS MOV AL,X ;取变量X的第一个数据,AL=34H ADD AL,Y ;Al的内容与变量Y的第一个值相加,执行后

;AL=34H+01H=35H

MOVZ,AL MOV AL,X+1 ;AL=56HGLUT_C2013-08JCB35

ADD AL,Y+1 ;AL=56H+09H=5FH MOV Z+1,AL ; MOV AL,X+2 ADD AL,Y+2 MOV Z+2,AL ……CODEENDS END如果要去X、Y、Z的偏移地址,使用

MOV BX,OFFSETX或使用

LEA BX,X指令中的寄存器BX可以是任何一个通用寄存器。对于DW、DD、DQ、DT位指令定义的变量与此类似进行存取。X345678Y010906Z355F7EGLUT_C2013-08JCB362字定义伪指令(1)格式:

[名称]DW<数据表>(2)功能:定义16位的字型数据,数据表中的每个数据占据2个字节,按地址增加的方向顺序存放。例如:ABCDDW01H,02H,1234H,DW5678H,0ABCDH每个字的数据占用2个字节,低字节在前高字节在后。为了字对齐,在自定义前可以使用对齐伪指令

EVEN(偶数地址) 或者ALIGNNumb;Numb=1,2,4,8,1601ABCD00020034127856CDABGLUT_C2013-08JCB37例ABCDB‘ABC12345’EVEN ;偶数地址EFGDW6,8,9或者ABCDB‘ABC12345’ALIGN2 ;2字节对齐EFGDW6,8,9GLUT_C2013-08JCB383四字节定义伪指令

(1)格式:

[名称]DD<数据表>(2)功能:定义4字节的数据,数据表中的数据从符号地址开始,每个数据占据4个字节,每个字从低位开始按顺序存放。例如:ABCDDD12345678H,23456789H,3456789AHDD456789ABH,56789ABCH,6789ABCDH为了双字对齐存放,在DD指令前可以使用

ALING4GLUT_C2013-08JCB39例:ABCDB01,02,03,04,05ALIGN4 ;四字节(双字)对齐ABCDDD12345678H,23456789H,3456789AHDD456789ABH,56789ABCH,6789ABCDHGLUT_C2013-08JCB404.8字节定义伪指令(1)格式:[名称]DQ<数据表>(2)功能:定义8字节的数据。数据表中的数据从符号地址开始,每个数据占据8个字节。GLUT_C2013-08JCB41510字节定义伪指令(1)格式:

[名称]DT<数据表>(2)功能:定义10字节的数据。数据表中的数据从符号地址开始,每个数据占据10个字节。GLUT_C2013-08JCB423.2.4复制操作伪指令(1)格式:<复制次数>DUP<数据表>(2)功能:重复定义数据。例如:

ABCDDB3DUP(1,2,3)表示连续定义3组一样的数据,在内存中的存放

它可以在字节型、字型……等中使用。01H02HABCD03H01H02H03H01H02H03HGLUT_C2013-08JCB43可以使用问号“?”表示未确定的数据,只是预留存储单元。例如:CDEFDW2DUP(?,2)重复2组,每组2个字型(16位)数据,第一个数据不进行初始化,第二个数据为0002H----CDEF02H00H----02H00HGLUT_C2013-08JCB443.2.5段定义伪指令8086/8088存储器是分段管理的,每个逻辑段长度不大于64KB。程序、数据、堆栈通常存放在各自不同的分段中。当程序代码较长,或需要分块编写时,程序也可以存放在不同的分段中。这些段需要用段定义伪指令进行说明与控制。GLUT_C2013-08JCB45格式:

段名

SEGMENT[定位方式][连接方式][‘类别名’]……

段名

ENDS它们成对使用。

功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始地址,段与段之间的连接关系。段的属性可选,如果选择,各项的顺序不能错,且用空格分开GLUT_C2013-08JCB461定位方式:有4种

可选。(1)PAGE方式:段起始地址的低8位全是0。 定义为页的开始地址,规定每页256字节,故低8位地址为0(2)PARA方式:段起始地址的低4位全是0。定义为节的开始地址,规定每节16字节,故低4位地址为0(3)WORD方式:段起始地址的低1位全是0。在字对准方式,字地址的为偶数地址,故地位地址为0(4)BYTE方式:段起始地址可以是任何地址。如果不选择,使用默认方式——PARAGLUT_C2013-08JCB472连接方式:告诉连接程序,所定义的段与其它段如何进行连接。共有6种连接方式。(1)NONE:本段与其它逻辑段没有关系,有独立的段地址。这是隐含的方式。例如:DATASEGMENTXDB20H ALIGN2 ;字对齐

YDW1234HDATAENDS

GLUT_C2013-08JCB48(2)PUBLIC:告诉连接程序,将本段与其它同名同类别的段连接在一起,形成一个物理段。这样,连接在一起的段具有共同的段起始地址,但具有不同的偏移地址。连接次序由连接命令指定。这也说明,段定义可以在程序中定义多个,可以重名。GLUT_C2013-08JCB49例如:DATA1SEGMENTPUBLICXDB10HDATA1ENDSDATA1SEGMENTPUBLICYDW2345HDAT1ENDS是两个同名、同类别的段,连接时,将合成一个段。GLUT_C2013-08JCB50(3)STACK:表示是堆栈段。连接方式同PUBLIC。每个程序至少有一个堆栈段,如果没有指定,则连接程序会报错,同时取约定的堆栈段。(4)COMMNON:与其它同名同类别段公用一个物理段,具有相同的段地址,程序运行时产生覆盖,即用完后,他又被其它程序使用。这种覆盖技术可以节省内存。(5)MEMORY:该段定义在其它所有段之上,即定位在高地址处。如果定义了多个这样的段,则连接程序将第一个遇到的段作为该类型段,其它则作为COMMON段处理。GLUT_C2013-08JCB51(6)AT<表达式>:表达式是可以求出16位值的,该方式告诉连接程序:直接将段定义在16位的表达式的值。GLUT_C2013-08JCB523类别名用单引号‘’括起来的符号。它与标号的定义规则相同。它是程序员起的一个与段名不同的另一个名字信息。作用:程序中所有的类别相同的段将被组成一个段组,该段组以他们共同的类别作为名字。常用的类别:STACKCODEDATA例如:STACKSEGMENTPARASTACK‘STACK’SATPNDB100DUP(?)STACKENDSGLUT_C2013-08JCB533.2.6段寄存器说明伪指令教材上又叫做假定伪指令。格式:

ASSUMESEG:段名[,SEG:段名2…]功能:告诉汇编程序,在汇编时,各段寄存器所对应的逻辑段基址。除代码段外,所有段寄存器的实际值必须用传送指令在程序运行时进行赋值。GLUT_C2013-08JCB54例:NAMESAMPLEDATASENMENTXDB10HENEN ;字对齐

YDW2020HDATAENDSSTACKSEGMENTDW128DUP(?)STACKENDSCODESEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACK代码段,寄存器CSDATA段,寄存器DSGLUT_C2013-08JCB55START:MOVAX,DATA;数据段开始地址

MOVDS,AXMOVAX,STACK;堆栈段开始地址

MOVSS,AX……CODEENDS;代码段结束ENDSTART;程序结束GLUT_C2013-08JCB56ASSUME伪指令的说明(1)位置在代码段内。第一个ASSUME语句紧跟段代码段定义语句后。它定义当前段段寄存器。(2)如果没有新的ASSUME伪指令重新定义,则原有定义一直有效。(3)不在当前段内的变量和数据存储单元是不可访问的。(4)ASSUME伪指令不产生目标代码,仅告诉汇编程序,哪些段是当前段,分别与哪个段寄存器关联。(5)如果在程序中间用ASSUME定义了新的DS或ES关联段,则紧跟着该伪指令后,应该将新的段的首地址送DS或ES。(6)汇编程序利用该伪指令给出的信息产生正确的目标代码。GLUT_C2013-08JCB573.2.7定位伪指令ORG

格式:

ORG<表达式>功能:告诉汇编程序,后面的程序或数据从表达式指定的地址开始存放。EVEN格式:

EVEN<表达式>功能:告诉汇编程序,后面的程序或数据从偶数地址开始存放。如果前面存放,留有一个奇数地址,则空下。GLUT_C2013-08JCB58例如:DATASEGMENTXDB10HEVENYDW0200HORG06HZDB‘A’DATAENDS假设开始地址为0000H,则数据的存放。10H--0000H00H02H41H0001H0002H0003H0007H0004H0005H0006H0008HGLUT_C2013-08JCB593.对齐伪指令ALIGN(1)

格式:

ALIGN

Num

其中:Num必须是2的幂,如:1、2、4、8和16等。(2)作用:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。

如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。

GLUT_C2013-08JCB603.2.8定义存储单元类型的伪指令PTR确定存储器操作数的属性(字节数)BYTE

温馨提示

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

最新文档

评论

0/150

提交评论