计算机组成与课件-第5章汇编语言_第1页
计算机组成与课件-第5章汇编语言_第2页
计算机组成与课件-第5章汇编语言_第3页
计算机组成与课件-第5章汇编语言_第4页
计算机组成与课件-第5章汇编语言_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

1第5章汇编语言层5.280x86宏汇编语言的语句格式5.380x86宏汇编语言数据、表达式和运算符5.6汇编语言程序设计基本技术5.1概述5.480x86宏汇编语言伪指令5.5宏指令25.1概述1.汇编语言一种面向机器的低级程序设计语言;符号化的机器语言,汇编指令与机器指令一一对应。2.汇编语言源程序用汇编语言编制的程序;不能由计算机直接执行。3.汇编程序应用汇编程序将汇编语言源程序翻译成目标代码(即机器语言程序)。34.汇编语言的特点高性能对计算机的完全控制有助于更好地使用高级语言编程有助于了解计算机的结构5.280x86宏汇编语言的语句格式

汇编语言源程序的基本组成单位是语句。1.语句的种类(1)指令语句(可执行语句)4表示计算机的某种具体操作,汇编时产生指令代码(即目标代码),在程序运行时实现。如在第四章介绍的指令语句。(2)伪指令语句(命令语句)

指示汇编程序如何对源程序进行汇编。例如程序如何分段、在程序中有多少个逻辑段、定义了哪些数据和数据单元,内存单元如何分配等操作。功能:在汇编时完成,通过执行汇编程序中的一段程序来完成。注意:除了所定义的数据项之外,其它项不产生目标代码。5(3)宏指令语句在5.5节中介绍2.语句格式分为指令、伪指令两种格式:(1)指令的格式

[]:方括号中的内容根据程序或指令的要求可有可无。标号:由26个大小写英文字母、0~9数字、—(下划线)、$、@、?等字符组成,数字不能出现在标号的第一个字符位置。[标号:]操作码[操作数]…[;注释]:冒号表示汇编程序的属性是NEAR。6操作码:汇编指令的助记符(关键字),一条汇编指令必须有唯一的操作码,指出该指令的操作内容。操作数:为操作提供必要的数据信息,操作数与操作数间用逗号分隔。注释:表示对该条指令的说明,可写可不写,如果有注释则必须在注释前加分号。(2)伪指令格式[名字]伪指令助记符[操作数][;注释][]:方括号中的内容根据程序或指令的要求可有可无。名字:是该语句的符号地址。伪指令助记符(伪操作符):给出该伪指令的操作内容。操作数:为操作提供必要的信息。7名字:变量名、过程名、段名、常量名等。名字作为符号地址具有三个属性:段基址、偏移量和类型。标号的类型:NEAR型和FAR型.变量的类型:字节、字、双字、四字等、六字节、十字节。3.标识符标号和符号名统称为标识符,由若干字符构成,规则如下:字符个数1~31;第一个字符必须是字母或5个特殊字符之一(?@下划线_点号·$);从第二个字符开始,可以是字母、数字和特殊字符;不能与系统专用保留字相同。如寄存器名,伪指令等85.3

80x86宏汇编语言数据、表达式和运算符5.3.1常数常数主要包括整数、字符、字符串、符号常量与数值表达式等。1.数值常数可用二进制、八进制、十进制、十六进制数表示如11001010B、73Q、345D、4aEH、0AH2.字符常数单引号或双引号扩起来的一个或多个字符,以ASCII码存储。3.符号常量

符号常量是用赋值伪指令EQU定义的符号名。9赋值伪指令的格式:常量名EQU表达式例如:XEQU100;X为符号常量,在程序中X为100,X是一个常量。4.数值表达式在汇编指令中,无论是指令还是伪指令,凡是以常数(立即数)或符号地址(变量、标号等)作为操作数的地方,均可使用数值表达式。5.3.2变量变量应先定义并预置初值,才能被引用。101、变量定义变量名数据定义伪指令<表达式1>,……可选DB定义字节DW定义字DD定义双字DQ定义8字节DT定义10字节例:DATA1DB10H定义变量过程要体现变量的三个属性:

DATASEGMENTDAT1DB12HDAT2DW1234HDATAENDS11(1)段属性(SEG)表示变量存放在哪个逻辑段中,用变量所在段的段基值表示。(2)偏移地址属性(OFFSET)表示变量在逻辑段中离段起始单元的距离,用字节数表示。(3)类型属性(TYPE)表示单个变量占存储单元的字节数。上述两个属性构成了变量的逻辑地址。变量的初值数值表达式12DATASEGMENT

VA1DB10H

DB20H,30H

VA2DW1234H

VA3DD12345678HDATAENDS字双字:

10H20H30H34H12H78H56H34H12H

:VA1VA2VA3存储器分配图00000HFFFFFH13字符串表达式存储在内存单元时是以字符所对应的ASCII码值存储

STRING1DB‘STRING’

STRING2DW‘ST’,‘RI’,‘NG’

STRING3DD‘ST’,‘RI’,‘NG’14“?”设置内存空间表达式“?”表示没有为该存储空间赋初值,汇编后该存储空间清零。不指定初值,在内存单元中可以为任意值。例:DB?,?,?DUP重复定义操作符变量名<数据定义伪指令><表达式1>DUP(<表达式2>)重复次数重复数据的内容为连续存储单元重复预置一组数据,格式如下:VA1DW20HDUP(4):04H00H

04H

:00H:存储器分配图VA1共20H字节15:33338:33338:DA2内层DUP操作重复4次,共4字节外层DUP操作重复10H次,共50H字节存储器分配图DUP操作符的嵌套使用DA2DB10HDUP(4DUP(3),8)162、变量的使用(引用变量名)(1)在指令语句中引用变量名,通常作为地址表达式的组成部分之一。例:设在某数据段中有如下的变量定义:VARDB40HDUP(?)含有变量名的地址表达式如下:直接寻址:VAR、VAR+08H变址寻址: VAR[SI]、VAR+5[DI]基址寻址: VAR[BX]、VAR+10H[BP]基址变址寻址:VAR[BX][DI]、VAR+06H[BP][SI](2)在数据定义语句中引用变量名在DW或DD数据定义语句的操作数字段上引用了变量名,17那么在为DW或DD伪指令分配的存储单元中,将预置被引用变量名的地址部分(段基值和偏移地址)。

DW:引用变量名的偏移地址DD:引用变量的段基值和偏移地址例如:NUM1 DB 10H DUP(?)

NUM2 DW 10H DUP(?)

ARRAYDB 10H DUP('ABCD')

ADR1 DW ARRAY ADR2 DD ARRAY地址构成:需要注意的问题:1)用DW定义的变量所赋的值是变量名或标号或子程序名时,则该变量所赋的值是变量名或标号或子程序名的偏移地址。182)用DD定义的变量所赋的值是变量名或标号或子程序名时,则该变量所赋的值是变量名或标号或子程序名的逻辑地址,其高字存放的是段地址,低字存放的是偏移地址。5.3.3标号标号是指令的符号地址,可作为转移类指令的目标地址。LOP:INCSI

JNZLOP

例:程序段如下1.标号的属性(1)段属性(SEG)表示指令在哪个逻辑段中19(2)偏移地址属性(OFFSET)表示这条指令目标代码的首字节离段起始单元之间的字节数。(3)类型属性(TYPE)表示指令的转移特性,标号作为段内转移指令还是段间转移指令的目标地址。NEAR(近)段内转移FAR(远)段间转移2.标号类型的设置(1)隐含方式直接指定指令的标号,隐含NEAR属性例如:NEXT:MOVAX,3000H(2)用LABEL伪指令设置标号类型20名字LABEL类型格式如下:标号NEAR/FAR变量名BYTE/WORD/DWORD(1)LABEL语句与指令语句配合使用例:SUB1_FARLABELFARSUB1:MOVAX,1234HMOV语句有两个具有相同段和偏移地址属性的标号:SUB1_FAR和SUB1,但类型属性不同,SUB1是NEAR属性,SUB1_FAR是FAR属性。21(2)LABEL语句与数据定义语句配合使用例:DATA_BYTELABELBYTEDATA_WORDDW20HDUP(567H)DATA_WORD和DATA_BYTE具有相同的段和偏移地址属性,但类型属性不同。有语句如下:MOVAX,DATA_WORD+4MOVAL,DATA_BYTE+4传送第3个字(5、6字节)传送第5个字节5.3.4表达式与运算符22表达式

常用作指令语句或伪指令语句的操作数;由常数、变量、标号通过运算符连接而成;有数值表达式和地址表达式;表达式在汇编时,经计算得到一个数值或地址。运算符算术运算符逻辑运算符关系运算符数值返回运算符属性运算符1、算术运算符包括:+(加)、–(减)、(乘)、/(除)、MOD(模除)、SHL(左移)、SHR(右移)23+、-、*、/

运算的操作数和运算结果都是整数;除法运算取商的整数,MOD运算取除法的余数;减法运算可用于同一段内的两个变量;需要注意的问题:算术运算符可以用于数值表达式或地址表达式中,当算术运算符用于地址表达式时,常用方法是“地址±常量”来描述指针的移动。【例】把首地址为BLOCK的字数组的第5个字送到AX中:

MOVAX,BLOCK+(5-1)*2【例】将数组长度(双字数)存到CX中:

ARRAYDD1,2,3,4,5,6,7COUNTDD?┆

MOVCX,(COUNT-ARRAY)/4假设数组ARRAY的地址是2000H,则COUNT=201CH(COUNT-ARRAY)/4=(201CH—2000H)/4=0007H24

AND、OR、XOR、NOT

2、逻辑运算符只用于数值表达式;按位进行逻辑操作;在汇编过程中完成运算;通常出现在源操作数中。【例】执行下列指令,计算其逻辑运算的值。

MOVAL,88HAND0FH;AL=08HMOVBL,88HOR0FH;BL=8FHMOVCL,88HXOR0FH;CL=87HMOVDL,NOT88H;DL=77H3、关系运算符

EQ(相等)、NE(不等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)格式:

<表达式1><关系运算符><表达式2>25比较两表达式的值,两表达式的性质相同;数值按无符号数比较,地址表达式比较偏移量;关系成立,结果为全1;关系不成立,结果为0。【例】MOVAX,((XLT10)AND0F0FH)OR((XGE10)AND0505H))该指令说明:当X<10做MOVAX,0F0FH。否则当X>=10做MOVAX,0505H。DA1DB3LT8DA2DB10NE0AH4、数值返回运算符SEG、OFFSET、TYPE、SIZE、LENGTH261.SEG(取段地址)操作符格式:操作符功能:取变量或标号的段基址。2.OFFSET(取偏移地址)

操作符格式:

操作符功能:取变量或标号的偏移值(偏移地址)。3.

TYPE(取类型值)

操作符格式:

操作符功能:取变量或标号的类型值。SEG

变量名/标号OFFSET变量名/标号TYPE变量名/标号4.LENGTH(取长度)操作符格式:操作符功能:取分配给变量的字节、字、双字、四字、六字节、10字节的个数LENGTH变量名275.SIZE(取总字节数)操作符格式:

操作符功能:SIZE给出一个变量的总字节数(也就是LENGTH和TYPE的乘积)。即:SIZE=LENGTH×TYPESIZE变量名需要注意的问题:1)LENGTH和SIZE操作符只用于变量。2)LENGTH和SIZE操作符只有用DUP定义的变量才有意义,没用DUP定义时LENGTH值为”1”。VAR1DB10,15,20MOV AX,SEGVAR1285、属性修改运算符

对变量、标号和存储器操作数的类型属性进行说明和设定。(1)PTR

(2):

(3)THIS

(4)SHORT

(5)HIGH

(6)LOW

(1)PTR(改变变量或标号类型操作符)操作符格式:类型PTR

地址表达式类型:BYTE、WORD、DWORD、QWORD、FWORD、TBYTE、FAR、NEAR。29地址表达式:表示地址的数值。变量:用变量名给出的有效地址。标号:指令的有效地址。操作符功能:临时指定变量或标号的操作类型。【例】PTR操作符的应用。在数据段定义:XDB‘A’YDW1234HZDD12345678H

…在代码段中:MOVAX,Y;类型匹配,正确此时AX=1234HANDBL,BYTEPTRY;用PTR取出Y变量中的一个字节,BL=34HM0VCLBYTEPTRY+1;用PTR取出Y变量中的一个字节,CL=12HMOVEAX,DWORDPTRX;用PTR将X字节变量转换成双字变量;EAX=78123441HMOVDL,BYTEPTRZ+3;将Z+3所指的字节内容送DL中,;DL=12H30【例】PTR操作符的应用。在数据段定义:X2DW?;X2为字变量X1EQUBYTEPTRX2;将X2的地址赋给X1,X1为字节常量X3EQUBYTEPTR(X2+1);X2+1的地址赋X3,X3为字节常量X3EQUX1+1;将X1+1的地址赋给X3,X3仍为字节常量31(2):(修改段操作符)操作符格式:

其中段寄存器:CS、DS、ES、SS、FS、GS。操作符功能:用段修改操作符来修改一个变量,标号或地址表达式的段属性(段超越)。

段寄存器:变量/标号/地址表达式32【例】操作符的应用。MOVAX,ES:[BX+SI];基址加变址寻址,隐含的段寄存器是DS,用”:”改变了段属性变成ESMOVEAX,GS:DWORDPTR[BX];寄存器间接寻址,隐含段寄存器;是DS改为GS,[BX]为一个地址,

;这个地址为双字的地址(3)THIS(指定类型操作符)操作符格式:变量名/标号/过程名THIS类型操作符功能:为某一个变量名指定一个类型(BYTE、WORD、DWORD)或为某一个标号或过程指定一种转移距离(NEAR,FAR)。同时指定该操作数地址与下一个存储单元地址相同。33【例】THIS操作符的应用。

VAR1EQUTHISBYTE;指定VAR1为字节常量

VAR2DW?;同时VAR1与VAR2的地址相同但类型不同,

;VAR1为字节(BYTE)变量,VAR2为字(WORD)变量。经过上述定义后:MOVAL,VAR1;此时VAR1为字节常量不用BYTEPTRVAR1MOVAX,VAR2;此时VAR2为字变量VAR1与VAR2的地址相同

(4)SHORT(短转移操作符)操作符格式:SHORT标号操作符功能:短转移操作符是用来指定JMP指令中转向地址为8位位移量,而不是在缺省时的16位位移量。34(5)HIGH(取高位字节)和LOW(取低位字节)操作符操作符格式:

操作符功能:取数值表达式或符号常量的高位字节或低位字节。HIGH/LOW数值表达式/符号常量【例】字节分离操作符的应用。

CONSTEQU0ABCDH┆MOVAH,HIGHCONST;AH=ABHMOVAL,LOWCONST;AL=CDH需要注意的问题:HIGH或LOW不能用于内存操作数。356、运算符的优先级规则:先高优先级,后低优先级;若有多个同优先级的运算符,则从左到右;

圆括号可改变运算顺序。365.480x86宏汇编语言伪指令5.4.1符号定义语句格式:符号EQU<表达式>1、等值语句EQU常数/数值表达式地址表达式变量/标号/指令助记符功能:将表达式的值赋给符号COUNTEQU5ADR1EQUDS:[BP+14]L1EQUSUBSTART注意:EQU伪指令不分配存储单元;在同一源程序中,同一符号不能用EQU伪指令重新定义;372、等号语句=格式:符号=表达式功能与EQU语句相同;

区别在于等号语句可重新定义符号。5.4.2处理器选择伪指令用于确定选择使用哪种指令系统,缺省时8086/8088指令系统和8087协处理器指令集。通常放在源程序的开头位置。.8086.286.286P.486.486P其中,“P”表示保护模式.386.386P.586.586P385.4.3段结构伪指令1、段定义伪指令SEGMENT/ENDS格式:段名SEGMENT[定位类型][组合类型][使用类型][‘类别名’]┇段名ENDS

功能:定义逻辑段,SEGMENT表示某个逻辑段开始,ENDS表示该逻辑段结束。其中:段名自定义。4个选项可选可不选,有可选项时各项顺序不能错,可选项之间用空格隔开。(1)段名:必选,开始与结尾的段名一致(2)定位类型:可选,指定装入时的起始边界要求即定义了当前段39在内存中起始边界的设定,说明了段与段之间的空隙。对齐类型可以是:PAGE(页)、PARA(节)、WORD(字)、BYTE(字节)、DWORD(双字)。4种:PAGE(页)、PARA(节)、

WORD(字)、BYTE(字节)默认1)

PAGE(页)

设该段的起始地址的低8位为”0”。该地址是可以被256整除的地址,1页为256字节,当对齐类型为PAGE时,说明该段从页的边界开始,该段与下一段的最大存储空间为256字节,假如在该段中只放一个字节的数据,则该段距下一个段的空隙为255个字节。402)PARA(节)

设段的起始地址的低4位为”0”。该地址是可以被16整除的地址,1节为16字节,当对齐类型为PARA时,说明该段从节的边界开始,该段与下一段的最大存储空间为16字节,假如在该段中只放一个字节的数据,则该段距下一个段的空隙为15个字节。对齐类型缺省时,隐含PARA(节的边界)。3)WORD(字)

表示本段的起始地址(段基地址)以偶地址开始。段与段之间最大空间为1个字,最大空隙为1字节。4)

BYTE(字节)

表示本段的起始地址可以从字节地址开始(任意地址)。段与段之间最大空间为1字节,段与段之间无任何空隙。(3)组合类型可选,指定段与段之间的连接方式416种:NONE(隐含)、PUBLIC、COMMON、

STACK、MEMORY、AT1)缺省:没有说明,汇编程序就认为本段不和别的段连接。2)PUBLIC:本段与同名段顺序连接。组成一个大的逻辑段,它们共用同一个段起始地址。3)COMMON本段与同名段从同一地址开始重叠连接。段长是同名段中最长的段的长度。4)STACK

表示该段是堆栈段的一部分。把所有相同‘类别名’的具有STACK组合类型的段连接成一个连续段。将连续段首地址送SS,段内最大偏移地址送SP。当定义了STACK属性后,在主程序中可省略对SS和SP的初始化。425)MEMORY

表示在N个互相连接的段中本段是定位地址为最高地址,如果有多个MEMORY的段,则把第一个遇到的段当作MEMORY处理,其他均当作COMMON(重叠)处理。6)AT表达式本段定位在表达式所表示的位置并且节对齐。如:S1SEGMENTPARAAT0A800H

表示本段段地址为0A800H并且节对齐。(4)使用类型可选,指定386以上CPU的段模式2种:USE16段基值和偏移地址都是16位

USE32段基值16位,偏移地址32位(5)类别名可选,单引号扩起来2.指定段寄存器伪指令(ASSUME)43格式:

功能:告诉汇编程序,在运行期间通过哪个段寄存器才能找到所要的指令和数据。该指令放在程序的代码段中。如:ASSUMECS:CODE,ES:ESTRA,DS:DATA,SS:STACKASSUME段寄存器名:段名[,段寄存器名:段名[……]]44完整段定义数据段名SEGMENT┇;数据段可有可无,也可多个用伪指令定义的数据空间┇

堆栈段名SEGMENT┇;堆栈段可有可无,也可多个用伪指令定义的数据空间┇代码段名SEGMENT┇ASSUME(定义寻址关系)起始标号:

MOVAX,数据段名

MOVDS,AX;初始化DSMOVAX,堆栈段名

MOVSS,AX;初始化SS┇过程名PROC┇;代码段最少有一个过程名ENDP代码段名ENDS45DS_DATA SEGMENT VAR1 DB12HDS_DATA ENDSES_DATA SEGMENT VAR2 DB34HES_DATA ENDSCODE SEGMENT VAR3DB56H

ASSUMECS:CODE,DS:DS_DATA,ES:ES_DATASTART: …… ┇ INCVAR1 INCVAR2 INCVAR3 ┇CODE ENDS ENDSTART463、段寄存器的装载(1)DS和ES的装载用数据传送指令例:MOVAX,DATA_DS;设置DSMOVDS,AXMOVAX,DATA_ES

;设置ESMOVES,AX

【例】设X为字节变量,是在数据段DATA1中定义的,Y是在另外一个数据段中定义的具有字节属性的符号地址,请将X变量的内容送Y数组的第6个元素中。DATA1SEGMENTXDB18HDATA1ENDSDATA2SEGMENTYDB10HDUP(?)DATA2ENDS47CODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2START:MOVAX,DATA1MOVDS,AX;将DATA1段地址送DSMOVAX,DATA2MOVES,AX;将DATA2段地址送ESMOVAL,X;AL=12HMOVY[5],AL;12H→Y+5单元中MOVAX,4C00H;返回DOS状态

INT21HCODEENDSENDSTART(2)SS的装入方法1:在堆栈段定义时,利用组合类型中的STACK项,表示将所有同类别名的具有STACK组合类型的段连接成一个连续段,系统自动将堆栈段地址装入SS寄存器,段内偏移地址装入SP。48STACK1SEGMENTPARA‘STACK’DW50HDUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,SS:STACK1┇当目标代码装入存储器后,SS中已自动装入STACK段的段基值,堆栈指针SP指向堆栈的顶部。方法2:在ASSUME中未有STACK项,用执行指令的方法装载,与DS/ES的装载方法类似

STACK1SEGMENTPARADW50HDUP(?)TOPLABELWORD;TOP属性为WORDSTACK1ENDS┇49CODESEGMENTASSUMECS:CODE,SS:STACK1START:MOVAX,STACK1MOVSS,AX;堆栈段的段地址送SSMOVSP,OFFSETTOP;堆栈段的栈顶地址送SP┇TOP是该堆栈的初始栈顶部地址。(3)CS的装入对CS和IP的装入方法是利用END后的标号来完成的。因为该标号是可执行程序的起始地址。使用结束伪指令END,格式如下:END<地址表达式>

执行转移类指令时,CPU自动修改CS和IP。50如:START:┇

ENDSTART

将START所在段的段地址送CS寄存器,将START所在段内的偏移地址送IP寄存器。需要注意的问题:CS和IP是不能够象DS或ES那样用数据传送指令进行人为修改,但在程序运行时,某些指令可修改CS和IP,如:调用过程指令(CALL和RET)、转移指令(JMP)、中断指令(INT和IRET)等等。4.操作系统下汇编程序的正常结束对于可执行文件(.EXE)在DOS提示符下正常结束可以用两种方法:51方法1:采用21H中断的4CH号功能

MOVAX,4C00H;或MOVAH,4CHINT21H

方法2:利用过程,采用返回断点方法

MAINPROCFARPUSHDS;保存原来的数据段段地址

MOVAX,0H;0送AXPUSHAX;0压栈┇

RET;返回DOS

MAINENDP5.结束伪指令(END)

在完整段定义源程序的最后一条指令为结束伪指令END,后面的起始标号是告诉汇编器该程序的起始点为起始标号处。指令格式:52END[标号]其中:标号可以是过程名或带“:”的标号。当标号缺省时表示该模块不是主程序模块。指令功能:表示整个程序的结束。并指明该过程或程序的起始地址。5.4.5内存模式和简化段定义伪指令1、内存模式伪指令确定用户程序中代码和数据在内存中的存放方式。指令格式:

·MODEL模型指令功能:定义存储器模型。53模型功能Tiny所有数据和代码装入同一个代码段内。该模型程序产生MS-DOS的.COM格式的文件。程序的起始偏移地址为0100H。一般用于小程序。用于MS-DOS。Small数据存放在一个64K字节的数据段,代码放在另外一个64K字节代码段。程序只有一个代码段和一个数据段。数据段和代码段均为近访问,是应用程序最常用的一种模型。用于MS-DOS和Windows。Medium数据装入一个64K字节的数据段中,而代码段可以是多于一个。数据是近访问的,而代码则可远访问。用于MS-DOS和Windows。Compact代码装入一个64K字节的数据段中,而数据段可以是多于一个。代码是近访问,数据则为远访问。用于MS-DOS和Windows。Large代码和数据都可分别装入多于一个的代码段和多于一个的数据段中。数据和代码都可以远访问。用于MS-DOS和Windows。Huge与Large模型相同,不同的是允许数据段大于64K字节。用于MS-DOS和Windows。F1at所有数据和代码使用一个段,允许使用32位偏移量,DOS下不支持这种模型,用于WindowsNT,MASM6.0以上版本。542、简化段定义伪指令简化段定义伪指令指令功能·DATA定义数据段·SATCK[size]堆栈段,大小可指定,大小不指定时,则默认1KB·CODE[name]代码段,段名可任选·MODEL选择存储模型·STARTUP在简化段定义框架中指示程序的开始·EXIT在简化段定义框架中,使程序返回到DOS状态55

.MODELSMALL .STACK20H

;定义堆栈段

.DATA

;定义数据段 ┇ ┇

.CODE

;定义代码段BEGIN:…… ┇ ┇ MOVAH,4CH INT21H ENDBEGIN例:3、预定义符号类似于EQU伪指令定义的等价符号,例如:@Model、@Code、@Data、@Fardata、@Stack、@Codesize、@Datasize565.4.6定位和对准伪指令1、位置计数器($)记录正在汇编的数据或指令的目标代码在当前段内的偏移地址。$:

表示位置计数器的当前值。2、定位伪指令(ORG)指令格式:

指令功能:使接下来的地址为常数表达式的值。

【例】DATASEGMENTAT0A00HORG100HSTR1DB‘HELLO’;STR1的偏移地址为0A100HORG200HSTR2DB‘HELLO’;STR2的偏移地址为0A200HDATAENDSORG常数表达式573、对准伪指令(EVEN)对准伪指令要为下一条指令或数据定义开始于偶数字节地址。指令格式:

指令功能:使接下来的地址为偶数字节地址。

EVEN【例4-30】DATASEGMENDORG10HXDB10EVENARRAYDB3DUP(?);(使数组ARRAY的偏移地址从偶地址开始)DATAENDS585.4.7过程定义伪指令PROC/ENDP过程名PROCNEAR/FAR ┇ RET ┇过程名ENDP过程定义在逻辑段内;过程名是必须的;至少有一条返回指令RET。格式:3个属性:段、偏移地址、类型属性;5.4.8包含伪指令INCLUDE格式:

INCLUDE<文件名>功能:将指定文件插入到正在汇编的源程序中。595.4.9标题伪指令TITLE格式:

TITLE<文本>功能:为程序指定标题。在源程序开始处使用;5.5宏指令1、宏指令的使用过程3步:宏定义、宏调用和宏展开指令格式:宏指令名MACRO[形式参数表]┇宏体┇

ENDM60【例】分别编写显示一个10进制数的宏和子程序。(1)编写程序宏定义:;显示一位10进制数据的宏,要显示的数在DL中DISPLDATAMMACRO ADDDL,30H;将要显示的10进制数转换成ASCII码

MOVAH,02H;显示

INT21HENDM

子程序:;显示一位10进制数据的子程序;入口参数:要显示的数在DL中DISPLDATAPPROCPUSHAX;保护现场

ADDDL,30H;将要显示的10进制数转换成ASCII码

MOVAH,02H;显示

INT21HPOPAX;恢复现场

RETDISPLDATAPENDP61

主程序:·MODELSMALL·386·CODE·STARTUPMOVDL,3;要显示的10进制数3送DL中

DISPLDATAM;调用宏在屏幕显示3MOVDL,9;要显示的10进制数9送DL中

CALLDISPLDATAP;调用子程序在屏幕显示9·EXIT;返回DOSEND(2)宏展开

·MODELSMALL

·386·CODE·STARTUPMOVDL,3;要显示的10进制数3送DL中

1ADDDL,30H;将要显示的10进制数转换成ASCII码

1MOVAH,02H;显示

1INT21HMOVDL,9;要显示的10进制数9送DL中

CALLDISPLDATAP;调用子程序在屏幕显示9·EXIT;返回DOSEND62(3)说明

宏展开后,在原主程序中的宏指令名DISPLDATAM的位置上用宏定义体取代,使目标程序变长,而子程序的调用,只是在程序执行时去执行子程序,在子程序中使用了堆栈来保存断点,而宏则不需要。2.宏与子程序的区别:(1)宏展开占有的存贮空间与调用次数有关:调用次数越多,占内存越大。(2)子程序占有它自身大小的空间,由主程序调用时,空间不随调用次数增大。因此,代码较长的功能段往往使用子程序,不用宏汇编。对代码较短的而且形式参数较多的功能段,使用宏更为合理633、宏操作符(1)连接操作符&功能:在宏定义的宏体内连接形参。例:SHIFT_VARMACROR_M,DRECT,COUNT MOVCL,COUNT

S&DRECTR_M,CL ENDM宏调用:SHIFT_VARAX,HL,2(2)表达式操作符%格式:%表达式功能:告诉宏汇编程序获取表达式的值,而不是表达式本身。64(3)文本操作符<>功能:将包含分隔符的实参扩起来,作为一个单一的实参。例:XCHAGE<BYTEPTR[SI]>,[DI],AL(4)字符操作符!格式:!字符“!”后的字符不作操作符使用,而是字符本身。只能用于宏定义中,宏体第一条语句;汇编时,符号展开为??XXXX

的形式。4、LOCAL为指令格式:

LOCAL<符号表>指令功能:解决宏扩展时引起的标号重复定义的问题。655.6汇编语言程序设计基本技术5.6.1程序设计步骤分析问题,建立数学模型;确定算法;编制程序流程图;

编制程序;调试程序。调试程序的步骤:1.编辑程序,构造源程序,其扩展名以.ASM。2.利用宏汇编程序MASM,将源程序汇编成以.OBJ

为扩展名的目标程序。663.利用连接程序LINK,将目标程序连接成.EXE的可执行文件。4.使用DEBUG调试程序,调试并允许可执行文件。基本结构:顺序结构、选择结构、循环结构和子程序结构。5.6.2顺序程序设计顺序程序设计在设计这种程序中,没有分支和循环,只要遵照算法按步骤顺序写出相应的指令即可。67例:试编制程序,计算下列公式的值,并将结果存放 在FUN存储单元中。

F其中X,Y,Z的值分别存放在VARX、VARY、VARZ三个字存储单元中,且计算过程的中间值和最后结果仍在16位二进制数的范围内。编制源程序如下:DATASEGMENT ;设置数据段

VARX DW123H ;变量X VARY DW456H ;变量Y VARZ DW789H ;变量Z FUN DW? ;结果单元DATAENDSSTACK1SEGMENTPARASTACK

;设置堆栈段

DW20HDUP(0)

STACK1ENDS68CODE SEGMENT

;设置代码段

ASSUMECS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA ;置段基值于DS MOV DS,AX MOV AX,VARX ;取变量X ADD AX,VARY ;AX(X+Y)

MOV BX,AX ;BX(X+Y)

SAL AX,1 ;AX2*(X+Y)

SAL AX,1 ;AX4*(X+Y)

ADD AX,BX ;AX5*(X+Y)

SAL AX,1 ;AX10*(X+Y)

MOV BX,VARZ ;取变量Z DEC BX ;BX(Z1)

MOV CX,BX ;CX(Z1)

SAL BX,1 ;BX2*(Z1)69ADDBX,CX ;BX3*(Z1)

SUB AX,BX ;AX10*(X+Y)

3*(Z1) SAR AX,1 ;AX{10*(X+Y)

3*(Z1)}/2 MOV FUN,AX ;存放计算结果

MOV AH,4CH ;终止用户程序,返回DOS INT 21HCODE ENDS

ENDSTARTMOVAH,4CH是将系统调用号4CH送入寄存器AH中,也就是将计算机的控制权交还给计算机的dos系统。INT21H是软中断指令。【例】设X、Y、Z为有符号字变量,编写程序计算表达式((X+Y)*5+8-X)/Z的值,结果存放到双字变量RESULT中。计算表达式的值算法分析:步骤1:计算X+Y;步骤2:计算(X+Y)*5;步骤3:计算(X+Y)*5+8步骤4:计算(X+Y)*5+8-X70步骤5:计算((X+Y)*5+8-X)/Z程序算法流程图根据流程图编写汇编程序:DATASEGMENT;数据段,定义X、Y、Z为字变量XDW?71YDW?ZDW?RESULTDD?;RESULT为双字变量DATAENDSCODESEGMENT‘CODE’;代码段

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;数据段段地址送DS中MOVAX,XADDAX,Y;计算X+Y→AXMOVBX,5IMULBX;计算(X+Y)*5,AX*5→DX:AXADDAX,8ADCDX,0;计算(X+Y)*5+8,(DX:AX)+8→DX:AX72MOVWORDPTRRESULT+2,DX;余数→RESULT+2MOVAX,4C00H;程序结束返回DOSINT21HCODEENDS;代码段结束

ENDSTART程序说明:1)变量X、Y、Z为有符号字变量,在数据段中定义。加减法指令不分有符号或无符号,乘除法指令用有符号乘除法指令IMUL和IDIV。2)由于把5送到BX中,在IMULBX指令之前要把乘数AX符号扩展到DX中,才可以做(DX:AX)*BX→DX:AX。3)RESULT是双字变量,当商AX送RESULT低字,DX余数送RESULT高字时,要说明RESULT的字属性。4)该程序在调试过程中,应把X、Y、Z的值写在程序的数据段中,执行结果是在RESULT中,可以通过DEBUG或CodeView看到。73【例】通过键盘键入一个两位十进制数,将该数转换成压缩的BCD码,送BUF中。(1)分析:1)获取键盘键入的数据是利用下面两条指令来完成:

MOVAH,01H;1号功能,通过键盘读入1个ASCII码→ALINT21H;中断21H2)通过键盘键入的数字的ASCII码为:

键盘键入123456789ASCII码31H32H33H34H35H36H37H38H39H

将ASCII码转换成BCD码,用去掉30H的方法:

SUBAL,30H(2)程序流程图如图所示。7475(3)根据流程图编写汇编程序:DATASEGMENT;定义数据段BUFDB?;BUF为字节变量DATAENDSCODESEGMENT‘CODE’

;定义代码段

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;数据段段地址送DS中

MOVAH,01H;通过键盘读入十位ASCII码→ALINT21HSUBAL,30H;将十位ASCII码转换成BCD码→ALSHLAL,4;将十位BCD码左移4位→ALMOVBUF,AL;将AL→BUF保存

MOVAH,01H;通过键盘读入个位ASCII码→ALINT21HSUBAL,30H;将个位ASCII码转换成BCD码→ALORBUF,AL;将十位BCD码和个位BCD码合并→BUFMOVAX,4C00H;程序结束返回DOSINT21HCODEENDS;代码段结束

ENDSTART76(4)程序说明:1)用中断21H的1号功能,每次只能读入1个ASCII码送AL,在程序中分别两次从端口获取数据。2)

将ASCII码转换成BCD码后,将十位BCD码和个位BCD码合并送BUF中。3)该程序的执行结果在数据段的字节变量BUF中,可以通过DEBUG或CodeView看到。5.6.3分支程序设计分支结构就是在顺序结构的基础上加判断框形成程序的分支结构。771、转移指令无条件转移指令条件转移指令直接寻址间接寻址段内转移段间转移单条件转移指令无符号数条件转移指令符号数条件转移指令段内转移段间转移78(1)无条件转移指令格式:

JMP目标地址目标地址有两种表达方式a.直接寻址:目标地址通常是标号段内转移:相对转移,指令给出位移量DISP;执行操作:IP(IP)+DISP段间转移:指令中给出目标地址的段基值和偏移地址;执行操作:IP偏移地址

CS段基值例如:JMPNEXT;NEXT为标号JMP指令的下一指令与目标地址所指的指令之间的字节距离b.间接寻址:目标地址通常由寄存器或存储单元提供79段内转移:寄存器或存储单元提供偏移地址执行操作:IP偏移地址段间转移:由一个双字单元提供目标地址的段基值和偏移地址;执行操作:IP偏移地址CS段基值(2)条件转移指令格式:Jxx目标地址xx为转移条件只能在段内转移,而且是相对转移。a.单条件转移指令80指令转移条件含义JCCF=1有进位/借位转移JNCCF=0无进位/借位转移JE/JZZF=1相等/等于0转移JNE/JNZZF=0不相等/不等于0转移JSSF=1是负数转移JNSSF=0是正数转移JOOF=1有溢出转移JNOOF=0无溢出转移JP/JPEPF=1有偶数个“1”转移JNP/JPOPF=0有奇数个“1”转移b.无符号数条件转移指令81指令转移条件含义JA/JNBECF=0ANDZF=0A>B转移JAE/JNBCF=0ORZF=1AB转移JB/JNAECF=1ANDZF=0A<

B转移JBE/JNACF=1ORZF=1AB转移c.符号数条件转移指令指令转移条件含义JG/JNLESF=OFANDZF=0A>B转移JGE/JNLSF=OFORZF=1AB转移JL/JNGESFOFANDZF=0A<

B转移JLE/JNGSFOFORZF=1AB转移82(3)比较指令CMP比较指令的格式:CMPDST,SRC比较指令的功能:DST—SRC结果反映在标志上而不送回到目的操作数DST。对标志寄存器的影响:OF、SF、ZF、AF、PF、CF有影响。需要注意的问题:该指令的操作数只能是寄存器操作数和存储器操作数,两个操作数不能同时为存储器操作数。比较指令的操作数的比较结果:83用途比较指令标志寄存器比较结果比较DST和SRC是否相等(有符号或无符号)CMPDST,SRC做DST-SRCZF=1(结果为0)DST=SRCZF=0(结果为不0)DST≠SRC比较两个无符号数的大小(由CF、ZF判断)CMPDST,SRC做DST-SRCCF=0(无借位)ZF=1DST=SRCZF=0DST>SRCCF=1(有借位)DST<SRC比较两个有符号数的大小(由SF、OF判断)CMPDST,SRC做DST-SRCOF=0(无溢出)SF=0DST>SRCSF=1DST<SRCOF=1(有溢出)SF=0DST<SRCSF=1DST>SRC84例:设数据段中NUM1,NUM2两字节单元中有无符号整数,编程完成下面的操作:

如两个数均是偶数,两个数加1后分别送入DA1、DA2字节单元中;

如两个数均是奇数,两个数分别直接送入DA1、DA2字节单元中;

如一个是奇数,一个是偶数,则奇数直接送 DA1字节单元,偶数直接送DA2字节单元。

分析:依次测试NUM1和NUM2的奇偶性,有4种情况。NUM1奇NUM2偶DA1NUM1,DA2NUM2DA1NUM1,DA2NUM2奇85偶DA1NUM2,DA2NUM1DA1NUM1+1,DA2NUM2+1偶奇NUM1NUM2根据分析,画出流程图如下:86程序段如下:

MOVAL,NUM1 MOVAH,NUM2 TESTAL,01H JNEEND0

TESTAH,01H JNEL1INCAL INCAH JMPEND0L1: XCHGAL,AHEND0:MOVDA1,AL MOVDA2,AH

……87

假如:比较两数X和Y是否相等,相等执行程序段L1,不等执行程序段L2。则:┇

MOVAX,YCMPAX,X;Y-X结果不送目的操作数

JZL1;相等时ZF=1转到L1

温馨提示

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

评论

0/150

提交评论