【文档说明】第04章80868088汇编语言程序设计课件.ppt,共(53)页,467.483 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44747.html
以下为本文档部分文字说明:
第04章80868088汇编语言程序设计4.1程序设计语言概述汇编语言程序的上机与处理过程编辑程序Prog.asm文件汇编程序Prog.obj文件连接程序Prog.exe文件Edit.exeMasm.exeLink.exe
4.28086/8088汇编语言的基本语法••DATASEGMENT;定义数据段,DATA为段名SUMDW0;由符号(叫变量名)SUM指定的内存单元类型定义为一个字,初值为0DATAENDS;定义数据段结束STACKSEGMEN
TSTACK;定义堆栈段,这是组合类型伪指令,它规定在伪指令后须跟STACK类型名DB200DUP(0);定义堆栈段为200个字节的连续存储区,且每个字节的值为0STACKENDS;定义堆栈段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:COD
E;由ASSUM伪指令定义各段寄存器的内容例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。••START:MOVAX,DATA;将DS初始化为数据段首址MOVDS,AX的段值DATAMOVCX,50;CX置入循环计数值MOVAX,0;清AX累加器MOVBX,1;BX置常
量1NEXT:ADDAX,BX;累加奇数和,计50次INCBX;求下一个奇数INCBXDECCX;循环计数器作减1计数JNENEXT;未计完50次时,转至NEXT循环MOVSUM,AX;累加和送存SUM单元MOVAH,4CH;DOS功能调用语句,机器将结束本INT21H程序的运行,并返回DOS状
态CODEENDS;代码段结束ENDSTART;整个程序汇编结束••4.2.28086/8088汇编语言语句4.2.2.1汇编语言语句的种类和格式1语句的种类在8086/8088汇编语言中,有3种基本语句:指令语句伪指令语句宏指令语句••2语
句的格式(1)指令语句的格式[标号:][前缀]指令助记符[操作数表][;注释]1)标号标号代表“:”后面的指令所在的存储地址(这里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用2)前缀8086/8088中有些特殊指令,它们常作为前缀同其他指令配
合使用,例如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ),以及总线封锁指令LOOK等,都是前缀。••3)指令助记符4)操作数表操作数
表可以是一个或两个操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔。5)注释以“;”开始,用来简要说明该指令在程序中的作用(2)伪指令语句的格式[名字]伪指令[参数表][;注释]••DATASEGMENTAADW20H,-30HDATAENDSAA2000D0
FF••4.2.2.2指令语句1)标号的属性标号表示指令地址,是指令的符号地址,它具有3种属性——段地址、段内偏移量(或相对地址)以及类型。2)在指令的助记符之前,使用标号并紧跟一个冒号“:”,表示该标号被定义为一个类型为NEAR的标号。当然
,标号也可单列一行例如:subrout:movax,3000h3)使用过程定义,为过程取的名字也是一个标号RightPROCNEARRightENDP4)通常,“标号”只在循环、转移和调用指令中使用。
1.标号••1)常量是指那些在汇编过程中已经有确定数值的量2)常量分数值常量和符号常量两种3)符号常量的定义需用伪操作命令(伪指令)“EQU”或“=”4)数值常量加后缀字符H表示十六进制,O或Q表示八进制,B表示二进制,D表示十进制,十进制常省略后缀。例1:ON
EEQU1DATA1=2*12HMOVAX,DATA1+ONE即把25H送AX。4、1常量与数值表达式P131••5)一个能被计算并产生数值的表达式称为数值表达式例2:ANDAX,((NUMBLT5)AND30)OR((NMBGE5)AND20)当NUMB<
5时,指令含意为ANDAX,30;当NUMB≥5时,指令含意为ANDAX,20。此例中,操作符AND与操作数表达式中的AND具有不同的含意,前者是助记符,后者是伪运算。••4、2变量与地址表达式变量是内存中的一个数
据区的名字,即数据所存放地址的符号地址,它可以作为指令中的存储器操作数来引用变量一般都是在数据段或附加段中使用伪指令(即伪操作命令)DB、DW、DD和DT来进行定义[变量名]数据区定义伪指令表达式变量和标号
的差别1)变量是数据区的名字,表示存储器操作数的地址;而标号是指令地址的符号表示2)变量的类型是数据项存取单位的字节数大小;而标号的类型是NEAR和FAR3)标号常在循环、转移、过程调用等语句中使用••NOTE使用变量作为存储器操作数时要注意几个问题。
①必须在程序中明确一条指令是完成8位数据操作还是16位数据操作。例题4.13,4.14,4.15,4.16P133②变量作为指令中的存储器操作数使用时,其段属性(段基址)与该指令使用的缺省段寄存器内容
必须相符,若不相符则必须使用“跨段前缀”(或称段超越),否则指令无法从存储器中取得正确的操作数进行操作。••数值表达式:在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区中的初值使用。地址表达式:它表示存储器地址,其值一般都是段内的偏移地址,因此它具
有段属性、偏移值属性、类型属性。地址表达式主要用来表示执行性指令中的多种形式的操作数。地址表达式地址表达式由变量、标号、常量、寄存器BX,BP,SI,DI的内容(用寄存器名以及方括号表示)以及一些运算符组成。••地址
表达式中可以使用的运算符及使用规则:变量或标号可以加上或减去某个结果为整数的数值表达式,其结果仍为变量或标号,类型及段地址属性不变,仅修改偏移值属性。b方括号及寄存器BX,BP,SI,DI如这几个寄存器不用方
括号括起来,表示寄存器本身或操作数。例:MOVAX,SI表示将SI中的内容送AX中如这几个寄存器用方括号括起来,则表示地址表达式。例:MOVAX,[SI]表示将SI所指的存储单元中的字数据送AX中••c、PTR运算符类型运算符,它
用来说明某个变量、标号或地址表达式的类型属性,PTR格式为:数据类型PTR地址表达式数据类型可以是BYTE、WORD、DWORD、NEAR、FAR等。例:ADDBYTEPTR[DI],23HPRT指定地
址表达式[DI]的类型为字节,此句表示将23H与内存字节单元[DI]中的字节数据相加,结果送回内存字节单元[DI]。••例:INCBYTEPTRES:[BP+3]ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操作数当前所在的段为附加数据段。这时,操作
数的物理地址将由ES中的内容左移4位与偏移地址[BP+3]相加而求得。此句表示将附加数据段中偏移地址为[BP+3]的内存单元中的数据加1后仍保留在该单元中。如果没有跨段前缀“ES:”,那么,由[BP+3]地址表达式所表示的偏移地址将被系统默认为是在
堆栈段中。••(3)运算符综述IBM宏汇编中有5种运算符,即:算术运算符(Arithmeticoperators)逻辑运算符(Logicaloperators)关系运算符(Relationaloperators)分析运算符(Analyticoperators)合成运算符(
Syntheticoperators)SEG;OFFSET;TYPE;SIZE;LENGTH;HIGH;LOW••4.2.2.3伪指令语句1)DB(定义字节)用于申请一个数据项为字节的数据区2)DW(定义字
)数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是WORD。3)DD(定义双字)数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量属性),变量类型为DWORD。4)DQ(定义4
字)数据项为4字,变量类型为QBYTE。5)DT(定义10字节)数据项为10个字节,变量类型为TBYTE。1、数据定义伪指令••DSEGSEGMENTTABLEDW12DW34DATA1DB5TABLE2DW67DW89DW1011DATA2DB12RATESDW1314OTH
RATDD1718DSEGENDS这段程序用DB、DW和DD定义了若干变量,根据上述对数据定义命令的约定,则各变量及其属性可列于表4.5中:所有变量的段属性(分量)均为DSEG。DW、DB、DD右边的表达式或数值即相应存储单元中
的内容••“DW变量”语句表示利用该变量的偏移量来初始化相应的存储字;“DD变量”语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。DB、DW、DD可用于初始化存储器。这些伪指令的右边有一表达
式,表达式之值即该存储“单位”的初值。••FOOSEGMENTAT55HZERODB0ONEDWONE;内容为0001HTWODDTWO;内容为00550003H;即高位字为55H,低位字为3FOURDWFOUR+5
;内容为7+5=12SIXDWZERO_TWO;内容为0-3=-3ATEDB5*6;内容为30FOOENDSSTRING1DB′HELLO′STRING2DB′AB′STRING3DW′AB′••2、符号定义伪指令1)为常量定义
一个符号,以便在程序中使用符号来表示常量。格式:符号常量名EQU数值表达式2)给变量或标号定义新的类型属性并起一个新的名字。格式:变量名或标号名EQU[类型PTR]变量或标号BYTESDB4DUP(?)FIRSTWEQUWORDPTRBYTESFIRSTDWEQUDWORDP
TRBYTESINCHS:MOVBYTES,AL••3)可以给由地址表达式指出的任意存储单元定义一个名字。格式:符号名EQU地址表达式符号名可以是“变量”或“标号”,取决于地址表达式的类型。4)用来为汇编语言中的任何符号定义一个新的名字。格式:新的名字E
QU原符号名5)使用EQU伪操作命令时,EQU左端的符号名不能是程序已定义过的符号名。••3、段定义伪指令汇编源程序一般由若干段组成,以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字DATASEGMENTSUMDW0
DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS代码段与堆栈段是不可少的,数据段与附加段可根据需要设置整个源程序必须以END语句来结束。END后面的标号STAR
T表示该程序执行时的起始地址段名SEGMENT[定位类型][组合类型][′类别′]„;一系列汇编指令段名ENDS1)定位类型又称“定位方式”,表示该段对起始边界地址的要求,有4种定位类型:BYTE起始地址=XXXXXXXXXXXXXXXXXX,即字节型;WORD起
始地址=XXXXXXXXXXXXXXXXX0,即字型;PARA起始地址=XXXXXXXXXXXXXX0000,即节型;PAGE起始地址=XXXXXXXXXX00000000,即页型。其中PARA为隐含值,即如果省略“定位类型”,则汇编程序按PAR
A处理。••2)组合类型组合类型又称“联合方式”或“连接类型”。它指示连接程序,如何将某段与其他段组合起来的关系。连接程序不但可以将不同模块的同名段进行组合,并根据组合类型,可将各段顺序地连接在一起或重叠在一起。共有6种组合类型3)类别类别是用单引号括起来的字符串,以表示该段
的类别,连接程序只使同类别的段发生关联,连接时用于组成段组的名字。典型的类别如′STACK′、′CODE′、′DATA′等,也允许用户在类别中用其他的表示。••3.2设定段寄存器伪指令ASSUMEASSUME段寄存器名:段名[,段寄存器名:段名[,...]]告诉汇编程序用
SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中。CODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE使用ASSUME伪指令,并不能为段寄存器设定初值,仅仅只是告诉汇编程序各
段寄存器与内存中各段的关系。通常段地址值是操作系统根据需要装入,或者由用户自己装入ORG伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。其格式为:ORG表达式汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的ORG指令
。若省略ORG,则从本段起始地址开始连续存放。3、3ORG伪指令(1)过程定义伪指令格式:过程名PROC〔类型〕„;指令序列过程名ENDP(2)调用过程调用过程用“CALL过程名”来实现。(4)过程返回通常子程序中包括一至多条返回指令,即当过程运行至某种条件满足时
返回至主程序中调用指令的下一条指令继续执行。P146例4.364、过程定义伪指令一、顺序结构程序例:对两个8字节无符号数求和,这两个数分别用变量D1及D2表示。将两数之和的最高位进位放在AL中,两数之和的其他位按从高到低顺序依次放在SI,BX,CX,DX中。4.38086/8088汇编
语言程序设计基本方法DSEGMENTD1DB12H,34H,56H,78H,9AH,0ABH,0BCH,0CDHD2DB0CDH,0BCH,0ABH,9AH,78H,56H,34H,12HDENDSCSEGMENTASSUMECS:C,DS:D;说明代码段、数据段BG:MOV
AX,DMOVDS,AX;给DS赋段值LEADI,D1;将D1表示的偏移地址送DIMOVDX,[DI];取第1操作数到寄存器中MOVCX,[DI+2]MOVBX,[DI+4]MOVSI,[DI+6]LEADI,D2;将D2表示的偏移地址送DIA
DDDX,[DI]ADCCX,[DI+2]ADCBX,[DI+4]ADCSI,[DI+6]MOVAL,0ADCAL,0MOVAH,4CHINT21HCENDSENDBG二、分支结构程序例:比较
以存储器变量D1和D2表示的两个有符号字数据的大小,将其中较大数据放在BX寄存器中DATASEGMENTD1DW-123H;补码为FF85HD2DW-120H;补码为FF88HDATAENDSCODESEGME
NTASSUMECS:CODE,DS:DATA;说明代码段、数据段BEGIN:MOVAX,DATAMOVDS,AX;给DS赋段值MOVBX,D1CMPBX,D2JGENEXT;若D1≥D2,则不交
换,转NEXTMOVBX,D2;若D1<D2,则交换NEXT:MOVAH,4CHINT21HCODEENDSENDBEGIN三、循环结构程序例:找出从无符号字节数据存储变量VAR开始存放的N个数中的最大数放在BH中DSEGSEGMENT
VARDB5,7,19H,23H,0A0HNEQU$-VARDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG;说明代码段、数据段BG:MOVAX,DSEGMOVDS,AX;给DS赋段值
MOVCX,N-1;置循环控制数MOVSI,0MOVBH,VAR[SI];取第1字节数到BHJCXZLAST;如果CX=0则转AGIN:INCSICMPBH,VAR[SI]JAENEXTMOV
BH,VAR[SI]NEXT:LOOPAGIN;CX←CX-1,若CX不等于0则转LAST:MOVAH,4CHINT21HCSEGENDSENDBG(一)DOS模块和ROMBIOS的关系IBMPC及兼容机的ROM中有一系列外部设备管理软件,由它们组成了基本的输入输出系统(RO
MBIOS).DOS在此基础上开发了一输入输出设备处理程序IBMBIO.COM,这也是DOS与ROMBIOS的接口。在IBMBIO.COM基础上,DOS还开发了文件管理和一系列处理程序IBMDOS.COM。另外,DOS还有命令处理程序COM
MAND.COM,它与前两种程序构成基本DOS系统。通常用户程序通过IBMDOS.COM使用外部设备。使用汇编语言编程,可以直接使用ROMBIOS中的“中断程序”,甚至还可以直接用IN和OUT指令对设备端口编程。四、DOS及BIOS中断调用••(二)中断调用及
中断服务子程序返回中断调用是一种内部中断方式,它是通过执行INTn指令来实现的,即执行INTn指令,使CPU根据中断类型号(或向量号)“n”找中断向量表中第n项作为此服务程序的入口(0段相对地址4×n+0处的字为IP,0段相对地址4×n+2处的字为CS)。
INTn指令功能:①当前标志寄存器的内容压栈,保存TF②TF←0,TF←0③当前断点的CS值压栈,当前IP值压栈••④IP,CS←中断向量第n项的4字节内容中断向量分配情况如下:0~1FH,80H~F0H是ROMBIO
S的中断向量号。20H~3FH是DOS的中断向量号,40H~7FH用户备用。通常,一个中断服务程序有多种功能,对每一种功能用一个相应的编号表示,称为功能号。对应某一中断向量的某一功能,往往要指出其规定的输入参数,中断服务完毕后
,服务程序会有相应的输出。中断调用的步骤如下:①准备入口参数②功能号送AH③INTn••(三)DOS常用功能调用举例DOS的功能调用是指DOS为系统程序员和用户提供的一组常用子程序如何使用的问题,DOS规定用中断指令INT21H进入各功能调用子程序的总入口
所有DOS提供给用户的功能调用格式(包括ROM-BIOS调用)都是一样的,一般分为4个步骤:①在AH寄存器中设置系统功能调用号;②在指定的寄存器中设置中设置入口参数;③用INT21H(或ROM-BIOS的中断向量号)指令执行功能调用;④根据出口参数分析功能调用的执行情况。返回DOS
向量号21H功能号4CH该功能使系统结束程序运行后返回DOS状态。例:MOVAH,4CHINT21H2.键盘输入并显示向量号21H功能号1该功能从键盘输入一个字符,将其ASCII码保存
在AL中,输入字符回显在CRT上。例:MOVAH,1INT21H中断返回时,输入字符的ASCII码被存放在AL中,该字符并显示在屏幕上。3.向量号21H功能号8该功能输入一字符,其ASCII码存放在AL中,但不显
示。这种功能往往在设置口令时使用。例:MOVAH,8INT21H4.向量号21H功能号2入口参数:DL=待显示字符的ASCII码该功能显示DL中的字符。••(四)ROMBIOS常用中断调用举例前面介绍的DOS中断功能,虽然使
用起来很方便,但它只是简单概括了BIOS中的某些功能,并没有完整地揭示BIOS的功能。要求进一步了解BIOS的中断功能有如下几个理由:①调用BIOS中断程序虽然比调用DOS中断程序要复杂一些,但运行速度快,功能更强;②DOS的中断功能只是
在DOS的环境下适用,而BIOS功能调用则不受任何操作系统的约束;③某些功能只有BIOS具有。BIOS中颇具特色的有显示中断子程序,其向量号是10H。此外,还有读键盘中断子程序(其向量号为16H)与通信口
中断子程序(其向量号为14H)。1.向量号10H功能号0入口参数:AL=显示方式号(0~7)方式含意如下:显示方式号显示方式040列×25行黑白文本方式140列×25行彩色文本方式280列×
25行黑白文本方式380列×25行彩色文本方式4320列×200行黑白图形方式5320列×200行彩色图形方式6640列×200行黑白图形方式7单显80列×25行黑白文本方式例:屏幕设置成80×25彩色文本方式。MOVAH,0;设功能号
MOVAL,3;设显示方式号INT10H2.设置光标大小向量号10H功能号1入口参数:CH=光标顶值(范围:0~11)CL=光标底值(范围:1~12)例:将光标置成一个闪烁方块。MOVAH,1MOVCH,0MOVCL,12INT10H3.
设置光标位置向量号10H功能号2入口参数:BH=页号,通常取0页;DH=行号,取值0~24;DL=列号,对于40列文本,取值0~39;对于80列文本,取值0~79。例:将光标置在第10行30列。MOVBH,0MOVDH,10MOVDL,30MOVAH,2INT10
H4.屏幕上滚向量号10H功能号6入口参数:AL=上滚行数,当AL=0时,清除屏幕矩形方框;CH、CL=矩形方框左上角行、列号;DH、DL=矩形方框右下角行、列号;BH=增加空行的属性••