第5章汇编语言程序设计_第1页
第5章汇编语言程序设计_第2页
第5章汇编语言程序设计_第3页
第5章汇编语言程序设计_第4页
第5章汇编语言程序设计_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

第五章汇编语言程序设计5.1汇编语言语句的类型和组成5.2伪操作命令5.3

DOS系统功能调用和BIOS中断调用5.4汇编语言程序设计第五章汇编语言程序设计5.1汇编语言语句的类型和组成5.1.1汇编语言语句的类型

在汇编语言中我们不仅要知道指令系统,而且还必须了解汇编语言语句的组成和类型,了解汇编语言中的编写程序的格式以及格式中各个部分的意义,以便我们能够编写出正确的源程序。

汇编语言有自身的语法规则,汇编语言源程序中有3种基本语句:①指令性语句(由CPU指令组成);②指示性语句(伪指令语句)和宏指令语句。指令性语句和指示性语句是最基本的语句,也是最常用的语句。①指令性指令是给CPU的命令,它是由汇编程序翻译成机器语言指令,在程序运行时由CPU来执行,每条指令都对应CPU一种特定的操作,例如:算术运算、逻辑运算、串操作等;而伪指令是给汇编程序的命令,伪指令不汇编成机器语言,仅仅在汇编过程中告诉汇编程序应如何汇编。在汇编中由汇编程序进行处理,例如:定义数据分配,定义过程等。②指令性指令汇编以后,每条指令都产生其对应的机器代码;而伪指令则不产生与之对应的机器代码。

宏指令是使用者利用上述基本语句自己定义的新的指令。二者的区别是:例:5个连续字节单元的累加DATA SEGMENT ;定义数据段D1 DB5DUP(?) ;连续的字节单元CC EQU$-D1 ;对单元计数SUM DW0 ;为结果保留一个字DATA ENDS ;数据段定义结束STACKSEGMENTPARASTACK‘STACK’ ;定义堆栈段

DB100DUP(?) ;100字节的栈空间STACK ENDS ;堆栈段定义结束CODE SEGMENT ;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE ;对各段进行说明BEGIN:MOVAX,DATA ;DS初始化为DATA MOVDS,AX LEASI,D1 ;预置源数据的指针汇编语言程序结构特点定义存储单元的数据伪指令定义堆栈段定义语句作堆栈用的存储单元指令

MOVCX,CC+1 ;预置次数

CLD;(DF)=0,串指针自动增量

LODSBYTEPTR[SI] ;取一个数并修改指针

DECCX ;修改次数

MOVAH,0 ;清AX的高字节

CLC ;清CF位AGAN:ADCSUM,AX ;累加

LODSBYTEPTR[SI] ;再取数并修改指针

LOOPAGAN ;控制循环

MOVAH,4CH ;完成,返回DOS INT21HCODE ENDS ;代码段结束

END BEGIN ;整个程序结束段定义汇编程序结束

源程序的一般格式代码段是必需的。每段必须有且仅有一个名字,以SEGMENT定义段的起始,以ENDS定义段的结束,整个程序结束后需以END收尾。源程序的一般格式为: 段名1 SEGMENT

语句

语句 段名1 ENDS

段名2 SEGMENT

语句

语句 段名2 ENDS … END (标号)汇编语言源程序的结构段名1SEGMENT

语句行

……

语句行段名1ENDS段名2SEGMENT

语句行

……

语句行段名2ENDS……END标号或过程名一个源程序由若干段组成,如数据段、代码段、堆栈段等;各段由若干条语句行组成;指令必须放在代码段中;为了确保程序的执行和正确返回,必须借助堆栈段;根据编程需要确定是否需要数据段、附加段。5.1.2汇编语言语句的组成1.指令性语句:即执行性语句(指令)包括四部分:[标号:]指令操作码[操作数][;注释]例:AGAN:ADCSUM,AX ;累加2.指示性语句:即说明性语句(伪指令),由四部分组成:[名字]伪指令[操作数][;注释]例:SUM DW0 ;为结果保留一个字

汇编语言的语句行

指令性语句

指令,与机器码一一对应。

指示性语句

伪指令,可以对源程序进行指示、说明、定义等。注释语句

以分号开始,整行均是对程序的注解,增强可读性。本身不参与汇编,对指令代码无任何贡献。汇编语言的语句行构成

指令性语句[指令标号:]指令助记符[操作数1[,操作数2]];注释

指示性语句——伪指令[名字]伪指令助记符[参数1[,参数2,…,参数n]];注释汇编语言中的字符集字符

A~Z或a~z

注:汇编源程序中,大小写字符功能一样数字

0~9

注:数字不用于标识符的第一位特殊符号

?、/、%等注:标识符中谨慎使用特殊符号1、汇编语句的说明汇编语言中的保留字汇编源程序中标识符不能使用的字符串寄存器名例:AX、SP

标志符例:CF、TF

指令助记符例:MOV、ADD

伪指令符例:SEGMENT、END

运算符例:OFFSET、PTR标识符——由编程人员自行定义的、有特殊意义的字符序列。

标识符的使用可使用字母、数字、特殊字符(?@$_)不能使用保留字!符合字符集要求不用数字开头,第一个符号最好用字母长度小于32个字符

标识符的作用用作段名、过程名、结构名、宏名等的定义用作变量名,数据段符号地址的定义用作代码段标号

标识符(标号、符号地址、变量名)标识符数据段中的标识符符号地址具有存储地址值和数据类型的特征代码段中的标识符伪指令前的标号定义——变量指令前的标号定义——标号:标识符与常量

MOVAL,F8H(AL)=(F8H),从符号地址中取数

MOVAL,0F8H(AL)=F8H,常数F8H赋值

常量

整数:必须以数字开头!二进制数——以“B”结尾八进制数——以“O”或“Q”结尾十进制数——不带结尾字母,或以“D”结尾十六进制数——以“H”结尾

字符串连续的字节单元,每个单元均存放ASCII码。用包括在单引号中的字母表示(单引号本身不算作字符)。如‘ABCDEF’,对应的数值依次是61H~66H。常量——出现在源程序中指令操作数的位置,具有固定值的数值。

变量和标号

段基址:该单元所在段的首址,用相应的段寄存器值表示(16位)偏移量:该单元在段内的偏移量或有效地址,表示与段首地址之间的距离(16位)类型:该单元中存放的数据长度类型,可能是字节(Byte)、字(Word)或双字(DoubleWord)等,对应于类型值1、2、4变量——编程人员为内存单元起的名字。有3种属性:标号——编程人员为目标地址单元起的名字,对应于该指令在代码段中的存放地址。也有3种属性,仅类型与变量不同:

类型:标号的类型共有远(Far)、近(Near)两种,类型值分别是-2、-12

、表达式与运算符表达式——由运算符和操作数组成的、具有确定结果的有意义的序列,可作为指令的操作数。运算符——共有5类:算术运算符、逻辑运算符、关系运算符、分析运算符、合成运算符。操作数——常量、变量和标号等均可参与运算。对于地址指针,只能进行加/减算术运算。运算规则——表达式的值由汇编程序在编译的过程中自动完成计算,所得确定的运算结果与操作码一起被编译成机器码。汇编语言的运算符算术运算符:+、-、*、/、MOD、SHL、SHR逻辑运算符:AND、OR、XOR、NOT关系运算符:EQ、NE、LT、GT、LE、GE分析运算符:SEG、OFFSET、TYPE、SIZE、LENGTH综合运算符:PTR、DS:、THIS、SHORT、HIGH、LOW算术运算符数值表达式中可使用所有算术运算符地址表达式仅使用+、-算术运算符算术运算符不影响标志位例:完成80H+90H解:MOVAL,80H+90H;使用数值表达式

;(AL)=10H、CF=不变

MOVAL,80HADDAL,90H;使用加法指令

;(AL)=10H、CF=1算术运算符的使用若以算术运算表达式作为源操作数,则整个表达相当于立即数;运算结果(返回值)的长度由目操作数决定乘、除运算不带符号除法运算的返回值为整数商表达式的运算不影响标志位

例:MOVAL,80H+90H相当于MOVAL,10H80H+90H=10H由汇编程序完成;指令执行后(AL)=10H,各标志位不变。逻辑运算符AND、OR、XOR、NOT

逻辑指令助记符与逻辑运算符形同意不同逻辑指令助记符出现在指令语句的开始

AND

CX,00FFHAND10AEH

逻辑运算符出现在指令语句的操作数段

ANDCX,00FFHAND10AEH

注:等价指令ANDCX,00AEH逻辑运算符的使用若以逻辑运算表达式作为源操作数,则整个表达相当于立即数;运算结果(返回值)的长度由目操作数决定除NOT之外,均为双目运算符表达式的运算不影响标志位

例:ANDCX,1F03HAND72B6H

相当于ANDCX,1202H1F03H∧72B6H=1202H由汇编程序完成,各标志位不变;CX∧1202H在执行过程中完成。关系运算符

EQ

相等关系

NE

不等关系

LT

小于关系

GT

大于关系

LE

小于等于关系

GE

大于等于关系

进行关系判断时,表达式中所有的数均视为无符号数关系运算符EQ、NE、LT、GT、LE、GE

两性质相同的操作数的比较若关系正确为真(T),有全1

操作数若关系错误为假(F),有全0

操作数例:MOVBL,(PORTLT5)AND20H若PORT=2,(PORTLT5)=0FFH,为真

原式为MOVBL,20H若PORT=7,(PORTLT5)=00H,为假原式为MOVBL,00H关系运算符的使用

关系运算的返回值

若关系成立,即为真,返回全1(1个字)若关系不成立,即为假,返回全0(1个字)

例:MOVBX,(PORTLT5)AND20H

若PORT=2,(PORTLT5)=0FFFFH,为真原式相当于MOVBX,0020H

若PORT=7,(PORTLT5)=0000H,为假原式相当于

MOVBX,0000H分析运算符分析运算符(数值返回运算符)的功能

SEG

符号地址段值属性返回符

OFFSET符号地址偏移量值属性返回符

TYPE符号地址中数据类型属性返回符

LENGTHDUP重复次数返回符

SIZE

变量总字节数返回符分析运算符

SEG

取变量/标号的段基值

OFFSET取变量/标号的段内偏移量

TYPE取变量/标号的类型值

LENGTH

取以DUP定义的变量的重复次数

SIZE取以DUP定义的变量的总字节数分析运算符例:定义数据段DATA

如下:从实际地02000H开始存数据,即段地址为0200H,段内偏移地址从0000H开始

DATASEGMENTVAR1DB20,30VAR2DW2000H,3000HVAR3DD22003300HDATAENDS203000H20H00H30H00H33H00H22H段地址=0200H0000H0002H0006HVAR1VAR2VAR3分析运算符SEG和OFFSET应用MOVBX,SEGVAR1;(BX)=0200HMOVBX,SEGVAR2;(BX)=0200HMOVBX,SEGVAR3;(BX)=0200HMOVBX,OFFSETVAR1;(BX)=0000HMOVBX,OFFSETVAR2;(BX)=0002HMOVBX,OFFSETVAR3;(BX)=0006H分析运算符TYPE的应用返回变量数据类型所含的字节数

MOVBL,TYPEVAR1;(BL)=1MOVBL,TYPEVAR2;(BL)=2MOVBL,TYPEVAR3;(BL)=4

结构名返回结构所含字节数过程名返回近、远过程属性表示值(-1,-2)

即:对标号,返回标号的属性值

NEAR、FAR标号的属性值分别是-1、-2分析运算符LENGTH和SIZE:只对DUP指令有效,否则为1定义数据段

DATASEGMENTVAR1DB100DUP(?)

VAR2DW100DUP(?)

DATAENDS指令功能

MOVBX,LENGTHVAR1;(BX)=100MOVBX,LENGTHVAR2;(BX)=100MOVBX,SIZEVAR1;(BX)=100MOVBX,SIZEVAR2;(BX)=200LENGTH和SIZE

已有变量定义

VAR1DW100DUP(?)

VAR2DB?,?,?,?

运算符功能

MOVAX,LENGTHVAR1;(AX)=100MOVBX,SIZEVAR1;(BX)=200MOVCX,LENGTHVAR2;(CX)=1MOVDX,SIZEVAR2;(DX)=1设段的起始地址为02000HDATA SEGMENTDBYTE DB10,10HDWORD DW100,100HDDWORD DD12345678HDQWORD DQ1234567890ABCDEFHDBS DB‘AB’DWS DW‘AB’DWOFF DWOFFSETDWORDDATA ENDS例1:存储器示意图例2:DATA SEGMENTARRAY DB2DUP(0,1,2)ARRAY2 DW100DUP(?)ARRAY3 DB20DUP(0,1,4DUP(2),5)0A106400000178563412EFCDAB907856341241424241000102000102:::000102020202050001020202020200DBYTEDWORDDDWORDDBSDWSDQWORDDWOFFARRAYARRAY2100个字ARRAY3综合运算符综合运算符(属性修改运算符)

PTR

存储器操作数重新定义类型运算符

THIS

存储器操作数重新定义类型运算符

SHORT

页内跳转运算符

HIGH

字数据中高字节数据分离符

LOW

字数据中低字节数据分离符

ES:[]

段属性前缀符PTR运算符

PTR的使用

类型PTR变量、内存单元或标号作用给原有的操作数重新赋定类型。表达式结果返回一个与原有操作数具有相同的段基址和偏移量、不同类型的新操作数,但并不另分配新的存储单元!

可用的类型名称(保留字)变量或内存单元——BYTE、WORD、DWORD标号——NEAR、FARPTR的应用特点(MUL、DIV指令中的应用)

MULBYTEPTR[BX];(AX)←(AL)*[BX]⑻MULWORDPTR[BX];(DX)(AX)←(AX)*[BX]⒃DIVBYTEPTR[SI];(AL)←(AX)/[SI]⑻DIVWORDPTR[SI];(AX)←(DX)(AX)/[SI]⒃PTR运算符PTR的应用特点(JMP指令中的应用)

段内间接近转移

——CS不变、IP变存储器中的16位值为段内IP目的地址

JMPWORDPTR[BX]JMPWORDPTR[2000H]

段间间接远转移

——CS变、IP变存储器中的32位值为CS:IP目的地址

JMPDWORDPTR[BX]JMPDWORDPTR[2000H]PTR运算符综合运算符PTR与THIS的应用

PTR—先定义一个变量类型再用PTR

说明一个新的变量类型

VAR1DW2030H定义

VAR2EQUBYTEPTRVAR1说明

THIS—先用

THIS

说明一个变量类型再定义一个新的变量类型

VAR2EQUTHISBYTE

说明

VAR1DW2030H定义

应用

MOVAL,VAR2正确MOVAL,VAR1错误

MOVAX,VAR1正确MOVAX,VAR2错误30H20HVAR1VAR2SHORT运算符SHORT的使用

SHORT标号作用将已有标号说明为短标号,以便于条件转移指令使用。应用AGAINEQUTHISNEAR ;AGAIN为NEAR标号AGAIN:……JBESHORTAGAGIN;低于等于/不高于近转移综合运算符HIGH、LOW的应用

HIGH——分离字的高8位字节

LOW——分离字的低8位字节

应用

MOVAH,BX;指令错,源、目的操作数类型不匹配

MOVAH,HIGHBX;(AH)=(BH)

MOVAH,LOWBX;(AH)=(BL)HIGH、LOW运算符

HIGH——取得常数或表达式(字)的高字节

LOW——取得常数或表达式(字)的低字节

应用

MOVAL,HIGH2A3BH;(AL)=2AHMOVAH,LOW2A3BH;(AH)=3BH运算符的优先级别优先级别运算符高↑低()LENGTHSIZEPTRTHISOFFSETSEGTYPE段超越前缀HIGHLOW*/MOD+-EQNEGTGELTLENOTANDORXORSHORT

同一表达式内可进行多种运算没有括号时,按优先级别进行运算同一优先级的运算,按从左到右的顺序进行8086汇编语言运算符算术运算符逻辑运算符关系运算符分析运算符综合运算符+(加)-(减)*(乘)/(除)MOD(求余)SHL(左移)SHR(右移)AND(与)OR(或)XOR(异或)NOT(非)EQ(相等)NE(不相等)LT(小于)GT(大于)LE(小于或等于)GE(大于或等于)SEG(求段基址)OFFSET(求偏移量)TYPE(求变量类型)SIZE(求字节数)LENGTH(求变量长度)PTR段属性前缀THISSHORTHIGHLOW5.2伪操作命令数据类型定义伪指令段定义伪指令段说明伪指令过程定义伪指令符号定义伪指令EQU及=地址计数器伪指令$地址对准器伪指令ORG数据类型定义伪指令DB(DefineByte)——变量为字节数据类型(8位)DW(DefineWord)——变量为字数据类型(16位)DD

(DefineDWord)——变量为双字数据类型(32位)DQ(DefineQWord)

——变量为4字数据类型(64位)DT(DefineTbyte)

——变量为10字节数据类型(80位)操作数可以为:(1)数值表达式;(2)ASCⅡ码字符串;(3)地址表达式;(4)?(只保存内存空间,未定义初始值);(5)DUP子句,其格式为:重复次数DUP(操作数,…,操作数),DUP子句可以嵌套。数据类型定义伪指令变量定义伪指令的使用使用

[变量名]变量定义伪指令初值(表);为变量赋初值

[变量名]变量定义伪指令? ;保留空间常量、表达式均可作为初值DB的特殊用法

[变量名]DB字符串例:

DATA1 DW 7C00H DATA2 DD ? DB 3FH,66H,70H,TYPEDATA1 DATA3 DB ‘H72b9&!’DW、DD的特殊应用

已有字节变量的定义:

AVR1DB?

可用DW为16位地址指针赋值:

DWAVRDWAVR1字变量DWAVR的值为AVR1的16位段内偏移量

可用DD为32位地址指针赋值:

DDAVRDDAVR1双字变量DDAVR的值为AVR1的逻辑地址(32位)数据类型定义伪指令DB、DW的应用特点DATASEGMENTARE1DB20H,30HARE2DW2030HARE3DB‘A’,‘B’ARE4DW‘AB’DATAENDS20H30H30H20H41H42H42H41HARE1ARE2ARE3 ARE4数据类型定义伪指令DW、DD用于存储器地址分配

DW分配16位地址

DWAVRDWOFFSETAVR1

变量DWAVR的类型为16位变量DWAVR的值为变量AVR1的16位偏移地址

DD分配32位地址

DDAVRDDAVR2

变量DDAVR的类型为32位变量DDAVR的值为变量AVR2的32位目标地址

变量复制语句DUP()DUP的使用

[变量名]变量定义伪指令复制次数DUP(复制内容)应用

VARDW20HDUP(?) ;保留20H个字空间

XA DD3DUP(0) ;将连续3个双字单元清0XB DB2DUP(0FFH,?,4,‘4’)TYPEVAR=2LENGTHVAR=20HSIZEVAR=40HTYPEXA=4LENGTHXA=3SIZEXA=12TYPEXB=1LENGTHXB=2SIZEXB=8数据类型定义伪指令存储器地址分配的应用DATASEGMENTORG0004HAVR1DW2030HAVR2DB40HDWVRDWOFFSETAVR1DDVRDDAVR2DATAENDS30H20H40H04H00H06H00H00H20HAVR1AVR2DWVRDDVR0004H0006H0007H0009H设DATA的段首地址为2000H段定义伪指令SEGMENT、ENDS段名标识符

SEGMENT

[定位类型][组合类型][‘类别’]

〈段内定义〉

段名标识符

ENDS

用于对DS、ES、SS、CS段的定义段定义的相关约定组合类型:表示与其它段的关系,为连接程序提供信息,可以有6种选择:定位类型:规定段的起始边界,有4种选择:PAGE:段起始地址的最低8位必须为0。PARA:段起始地址的最低4位必须为0。WORD:段起始地址的最低1位必须为0,即从偶地址开始。BYTE:段起始地址为任意值,即从任何地址开始都行。缺省类型为PARA。NONE:本段与其它段逻辑上不发生关系,每段都有自己的基地址(缺省选择)。PUBLIC:连接程序首先将本段与其它同名同类别的段相邻地连接在一起,然后为所有这些PUBLIC段指定一个共同的段基址。连接的先后次序由连接命令指定。STACK:与PUBLIC同样处理,但此段作为堆栈段,SS指向第一个STACK段。COMMON:本段与其它同名同类别段重叠,段基址与最后定义的相同,长度为同名段中最大段的长度。AT表达式:连接程序把本段装在表达式值所指定的段地址(此方式不能指定代码段)。MEMORY:同PUBLIC连接程序将本段定位在被连接在一起的其它所有段之上。类别:给各段的名字信息,连接程序将类别名相同的段组成一个段组用它们共同的名字作为这个段组的名字。类别必须用单引号括起来。段定义的相关约定例:STACK SEGMENTPARASTACK‘STACK’段说明伪指令ASSUMEASSUME伪指令仅用在代码段首行代码段名SEGMENT[相关约定]

ASSUMECS:段名,DS:段名,…〈代码段内定义,指令集合〉代码段名ENDS例:ASSUMEDS:DATA,SS:STACK,CS:CODE过程定义伪指令PROCFAR、ENDP——远过程定义伪指令PROCNEAR、ENDP——近过程定义伪指令过程名PROCFAR(NEAR)

〈过程指令集合〉

RET过程名ENDP注:过程定义必须在代码段内

PROCFAR为定义远过程

PROCNEAR为定义近过程符号定义伪指令EQU、=格式符号EQU

表达式符号=

表达式注:符号而非变量,故用EQU、=定义的符号不占用存储器单元特点

EQU

不能重复定义

=

可重复定义,如X=X+1符号定义伪指令的基本形式为:符号名EQU表达式符号名=常数表达式功能:给表达式指定一个等价的符号名。说明:(1)=后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。(2)

EQU后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。(3)EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。符号定义伪指令EQU、=符号定义伪指令例DATASEGMENTARE1DB20HARE2EQU20HARE3DW4142HDATAENDS注:EQU定义的是常量,故不占存储单元20H42H41HARE1ARE30000H0001H地址计数器伪指令$表示下一个地址变量的偏移地址值

SORTDSEGMENTARRAYDB25,46,3,75,5COUNTEQU$-ARRAYSORTDENDSARRAY的偏移地址值为0000H$的偏移地址值为0005HCOUNT=0005H–0000H=525463755ARRAY0000H0005H$

把它称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。在程序中,“$”出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。

地址对准器伪指令ORG下一个地址变量的偏移地址值由ORG确定

DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS23434H12HVAR1$+3VAR20002H0008H$

ORG是起始位置设定伪指令,用来指出源程序或数据块的起点。利用ORG伪指令可以改变位置计数器的值。

汇编结束伪指令END的使用

END

第一条指令的标号或主过程名作用:表示汇编到此结束位于源程序的最后一行。END之后的语句不会被汇编程序翻译在源程序开始处可以用NAME或TITLE为模块取名字。

①NAME伪指令格式:NAME模块名汇编程序将以给出的“模块名”作为模块的名字。

②TITLE伪指令如果程序中没有NAME伪指令,则也可使用TITLE伪指令。格式:TITLE正文(text)

TITLE伪指令可指定每一页上打印的标题。同时,若程序中没有NAME伪指令,则汇编程序将用text中的前6个字符作为模块名。text最多可有60个字符。若程序中既无NAME又无TITLE伪指令,则将用源程序名作为模块名。所以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出标题来。程序开始伪指令(自学)

EVEN伪操作使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到此目的。例如:DATA_SEGSEGMENT┇ EVENWORD_ARRAYDW100DUP(?)┇DATA_SEGENDS对准伪指令格式:名称LABEL类型格式中的类型有BYTE、WORD、DWORD、结构名、记录名、NEAR、FAR共7种。前5种是属于变量的类型,后两种是属于标号的类型。格式中的名称就是语句的名称,为一标识符,若后面的类型是前5种之一,那么该名称就是变量名;当类型为后两种时,该名称就是标号。我们已经知道,变量与标号除具有类型属性外,还具有段和偏移地址的属性,名称的这两个属性就是汇编程序汇编到该语句时语句所在的段和偏移地址。LABEL伪指令

BARRAYLABELBYTE;AARRAYDW100DUP(?)

上面定义了两种类型的变量,BARRAY为字节类型,AARRAY为字类型,它们的段和偏移地址属性完全相同,都是下面保留的100个字空间的首地址。其目的是为了程序中可以对这100个字空间作两种不同类型的操作。在这一点上,LABEL的作用与前面介绍的PTR操作符的作用相类似。

该伪指令的功能是定义某变量名或标号的类型的。它虽具有段与偏移地址的属性,但它并不占内存单元。例如:

LABEL伪指令

在我们的程序中,总会有数据的输入和输出。实现数据的输入与输出将涉及输入、输出设备的管理,而对输入、输出设备管理的具体操作是十分繁琐的,好在系统为我们提供了方便。实际上,无论是用户程序还是DOS系统本身,都离不开输入、输出操作,PCDOS系统将输入、输出管理程序编写成一系列子程序,不仅系统可以使用,用户也可以像调子程序一样方便地使用它们。在IBMPC系统中,除了DOS系统中有一组输入、输出子程序可供用户调用外,在系统的ROM中也有一组输入、输出管理程序可供用户使用,这组程序通常称为ROMBIOS(ROMInput/OutputSystem)。5.3

DOS系统功能调用和BIOS中断调用

调用系统提供的子程序,通常称为系统功能调用。功能调用的基本方法是采用一条软中断指令INTn。所谓软中断是以指令的方式产生的中断,当CPU执行该指令时,就像响应外部中断一样的方式转入中断处理程序,中断处理程序结束后又返回到INT指令的下一条指令处。指令中的n为中断类型号,不同的n将转入不同的中断处理程序。所以,系统所提供的处理输入、输出的子程序是以中断处理程序的方式编写的。关于中断和如何转向中断处理程序以及中断处理程序的结构,将在第7章中详细介绍。本节将主要说明与基本输入、输出有关的DOS系统功能调用的调用方式及其用途,目的是为程序设计中实现输入、输出操作打下基础。

DOS功能调用

DOS功能调用类型号中断功能类型号中断功能20H程序结束21H请求DOS功能调用22H结束地址23H中止(Ctrl-Break)处理24H关键性错误处理25H磁盘顺序读26H磁盘顺序写27H程序结束且驻留内存28HDOS内部使用29~2EHDOS内部保留2FHDOS内部使用30~3FHDOS内部保留

DOS系统功能调用主要是由软中断指令INT21H实现的,这是一条功能极强的指令。当累加器AH中设置不同的值时,指令将完成不同的功能,我们称AH中设置的内容为功能号。该指令的功能大体可分为输入、输出设备管理、件管理及目录管理三个方面。这里,我们主要介绍输入、输出设备管理的功能及调用方式,DOS功能调用的其余功能请参阅附录C。

下面给出AH中设置的值与其对应的功能关系。

DOS功能调用带回显的字符输入,功能号01H功能:从标准输入设备(如键盘)输入一个字符,并显示在标准输出设备(如CRT)上。如无字符输入,则等待。入口参数:无返回值:

AL=输入字符的ASCII码例:MOVAH,01H ;功能编号

INT21H ;调用

CMPAL,0DH ;输入字符是回车符吗?

…字符输出,功能号02H功能:将一个字符(ASCII码)输出到标准输出设备(如CRT)上入口参数:DL=即将输出字符的ASCII码返回值:无例:MOVDL,‘$’;欲输出一个“$”符号

MOVAH,02H ;功能编号

INT21H ;调用无回显的字符输入,功能号08H功能:从标准输入设备输入一个字符,不显示在标准输出设备上。若无输入,则等待。入口参数:无返回值:AL=输入字符的ASCII码

MOVAH,08H ;功能编号

INT21H ;调用输出字符串,功能号09H功能:向标准输出设备输出以“$”为结束符的字符串(“$”符不显示),串中不含控制符入口参数:地址指针DS:DX,指向待输出的字符串首址返回值:无例:STRDB‘TodayisMonday.$’;即将输出的字符串

… LDSDX,STR ;DS:DX为指针

MOVAH,09H ;功能编号

INT21H ;调用带缓冲区的字符串输入,功能号0AH功能:由用户提供缓冲区,从标准输入设备输入一个以回车符(0DH)结束的字符串并接收在缓冲区内,同时回显在标准输出设备上(不显示回车符)。入口参数:地址指针DS∶DX,指向接收缓冲区的首址返回值:无例:STRDB20,?,20DUP(?);用户定义的缓冲区

LENDB? ;实际串长单元

LDSDX,STR ;DS:DX为STR指针

MOVAH,0AH ;功能编号

INT21H ;调用

LEASI,STR MOVLEN,[SI+1] ;实际串长取输入状态,功能号0BH功能:检查标准输入设备(如键盘)是否有输入,结果体现在返回值上。入口参数:无返回值:

(AL)=00;表示无任何输入

(AL)=0FFH ;表示有任意输入例:MOVAH,0BH ;功能编号

INT21H ;调用

CMPAL,0FFH ;有按键吗?

JEREADY ;有则转至READY处程序终止,功能号00H功能:通知DOS程序结束,并释放所占的内存空间。这是程序退出DOS的方法之一。入口参数:无返回值:无例:MOVAH,00H ;功能编号

INT21H ;调用进程结束,功能号4CH功能:返回DOS或结束进程,并回送一个返回值。入口参数:AL=返回值返回值:无例:MOVAL,01H ;送返回值

MOVAH,4CH ;功能编号

INT21H ;调用置中断向量,编号25H功能:将某个系统固定的中断向量(即中断处理程序的入口地址)设置为用户自己的中断处理程序的入口地址。入口参数:AL=将要设置的中断类型号

DS∶DX=中断处理程序的段基址∶偏移量返回值:无例:START: ;溢出中断处理入口

… MOVDS,SEGSTART;以DS:DX指向用户的中断入口

MOVDX,OFFSETSTART MOVAL,4 ;置4号中断

MOVAH,25H ;功能编号

INT21H ;调用取中断向量,编号35H功能:取系统固定的中断向量,并存入寄存器保存。入口参数:AL=要取的中断类型号返回值:ES:BX=系统的中断向量例:MOVAL,0;取0号(除数为0)中断向量

MOVAH,35H ;功能编号

INT21H ;调用

PUSHES ;将取得的中断向量段值入栈

PUSHBX ;段内偏移量入栈

结束用户程序、返回DOS的方法利用功能调用4CH MOVAH,4CH INT21H利用功能调用00H MOVAH,00H INT21H调用20H号中断中断类型号为20H的中断服务功能是程序结束,所以在程序结束时加上指令

INT20H即可返回。结束用户程序、返回DOS的方法转移至0单元源程序进行汇编时,汇编程序会自动在程序段前缀的开始处放上一条INT20H指令,因此在用户程序结束时只要用无条件转移指令:

JMP0

即相当于执行了调用20H号中断,可以返回DOS。此法实际上与前一种方式是一样的。BIOS提供了访问主要I/O设备的服务程序。

下面主要介绍显示器输出服务和键盘输入服务。(1)INT10H:显示器输出INT10H包含了与显示器有关的功能,可用来设置显示方式,设置光标大小和位置,显示字符等。①AH=0AH:显示字符入口参数:AL=欲显示字符的ASCII码。②AH=0EH:显示字符入口参数:AL=欲显示字符的ASCII码。功能:类似于0AH功能,但显示字符后,光标随之移动,并可解释回车,换行和退格等控制符。

BIOS功能调用(2)INT=16H:键盘输入①AH=0:从键盘读一键出口参数:AL=ASCII码,AH=扫描码。功能:从键盘读入一个键后返回,按键不显示在屏幕上。对于无相应ASCII码的键,如功能键等,AL返回0。②AH=1:判断是否有键可读出口参数:若ZF=0,则有键可读,AL=ASCII码,AH=扫描码;否则,无键可读。③AH=2:返回变换键的当前状态出口参数:AL=变换键的状态。

BIOS功能调用详见附录B5.4汇编语言程序设计1.程序具有模块化结构,清晰易读,易调试易维护。2.能够正常运行,结果正确。3.执行速度快。4.占用内存空间小。

对于任何一个编程者来说都想编制出一个高质量的标准化软件程序,而一个高质量的标准化软件程序应具备以下特点:5.4.1概述程序设计一般应按下述步骤进行(对于给定的课题进行程序设计):1.依据设计任务,抽象出描述问题的数学模型。2.确定实现数学模型的算法或求解的具体步骤和方法。3.绘制出程序流程框图。流程框图一般包含起始框、执行框、判断框和终止框,如图所示。

4.分配存储空间及工作单元(包括寄存器)。确定数据段、堆栈段、代码段及附加段在内存中的位置。5.依据流程图编写程序6.静态检查(检查指令是否合适,是否有语法和格式错误)。7.上机调试。8.程序运行,结果分析。

程序设计是指为计算机编写的、能够接受并执行的、且具有实际意义的语句序列。对于汇编语言程序设计,了解指令系统、伪指令及宏指令是最基本的要求,这些内容在前面都已进行了介绍。合理地使用不同的指令进行汇编语言程序的编制仅仅是一个基础,是编出高质量程序的一个方面。然而程序设计的方法可体现出一个程序设计者的思路及运用指令的水平。5.4.2程序设计方法

程序设计是把解决实际问题的方法转化为程序。由于实际问题有简单与复杂之分,因此程序设计就需要根据解决问题的思路,运用一些基本的程序设计方法设计出解决不同问题的程序来。在汇编程序设计过程中,首先对要解决的问题的过程进行具体的描述,这也是编程的准备阶段,对于较小的程序可以使用程序流程图。对于较大的程序可以采用模块化程序设计方法。无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来。基本的程序结构包括顺序结构、分支结构、循环结构及子程序结构。由于不同的问题可采用不同结构设计,因此需要对各种结构形式有所了解,才能找到解决某一问题的最佳程序结构形式。1.

基本源程序结构:过程定义法

CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFAR;START为过程名

PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX;上述为固定写法

程序正文(指令集合)RET;过程返回

STARTENDP;结束过程定义

CODEENDS;结束代码段

ENDSTART;结束汇编2.基本源程序结构:主程序定义法

CODESEGMENTASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AX

程序正文(指令集合)

MOVAH,4CHINT21H;21H号中断退出

CODEENDS;

结束代码段

ENDMAIN;结束汇编

3.

基本程序设计顺序程序设计

指令指针IP值线性增加条件程序设计

IP值受标志位的影响而跳变循环程序设计

IP值受计数器CX中的值不为零而循环

顺序结构是一种最简单的程序设计结构形式。采用这种结构只能完成简单的任务程序设计。顺序结构在任何结构的程序中都会出现,因此说它是基础。下面举一个顺序结构的程序设计例子,要求完成表达式所规定的操作:Y=X1+X2+X3。首先分析程序设计方法:

①表达式Y=X1+X2+X3的计算过程可采用顺序执行的方法来完成:首先读入数据X1、X2、X3;其次计算X1、X2、X3的和;最后保存结果到指定变量Y中。

②根据计算步骤编写汇编语言程序:利用伪指令确定存储器的分配,将X1、X2、X3定义为字变量;按照汇编语言源程序结构要求编写源程序。顺序程序设计

程序如下:PROGRAMDATASEGMENTDATA1DWX1,X2,X3,?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,[DATA1]

ADDAX,[DATA1+2]

ADDAX,[DATA1+4]

MOV[DATA1+6],AXHLTCODEENDSENDSTART顺序程序设计

可以看出,上面的源程序是由数据段和代码段两部分组成的。在数据段定义了X1、X2、X3为自变量,在运行时应填入具体数值。代码段确定了各段与段寄存器的关系,并且以计算机的基本操作指令按顺序执行的结构形式将计算机操作过程进行描述,从而完成程序设计的最初阶段任务。一个源程序的编写过程还说明不了程序的正确性,必须经过上机调试,才能验证设计的程序是否符合要求。顺序程序设计例试编程对两个无符号二进制数的加法,结果放入BUF。分析

这是一个多字节求和任务,此任务应从低字节开始求和,在进行高字节求和时应考虑低字节的进位位。所以,低字节求和时可以用ADD指令,但高字节求和时应用ADC指令。流程图如图所示。编写程序如下:DATA SEGMENT AAl DB0C7H,24HAA2 DB0ACH,79HSUM DW2DUP(?)DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEASI,AA1 LEADI,AA2 MOVAL,[SI] MOVBL,[DI]ADDAL,BLINCSIINCDIMOVAH,[SI]MOVBH,[DI] ADCAH,BH LEASI,SUM MOV[SI],AX HLT CODE ENDS ENDSTART顺序程序设计用查表法求Z=X3定义数据段

DATASEGMENTTABLEDB0,1,8,27,64,125,216XVALDB6YVALDB?DATAENDS0182764125216TABLE定义堆栈段

STACKSEGMENTDB100DUP(?)STACKENDS注:堆栈段一般不定义,由汇编程序自动生成顺序程序设计定义代码段CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,TABLEMOVAL,XVALXLATMOVYVAL,ALRETSTARTENDPCODEENDSENDSTART;标准写法;程序指令;标准写法

在解决某些实际问题时,解决问题的方法随着某些条件的不同而不同,将这种在不同条件下处理过程的操作编写出的程序称为分支程序。程序中所产生的分支是由条件转移指令来完成的。汇编语言提供了多种条件转移指令,可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段,对问题进行处理。采用分支结构设计的程序,结构清晰、易于阅读及调试。下面是一个采用分支结构设计的程序例子,要求从键盘上输入字符,若为A~Z,则将其转换为对应的ASCII码并显示;若为0,则结束输入。条件程序设计(分支结构程序设计)首先使用程序流程图将解决问题的思路描述出来,如图所示。程序如下:ABC1:MOVAH,01H;置键盘输入并回显

INT21H

;系统功能调用

CMPAL,0

;输入字符与0比较

JEABC2

;为零结束

CMPAL,‘A’

;判断是否小于大写字母A

JL

ABC1

;小于大写字母A返回重新输入

CMPAL,‘Z’;判断是否大于大写字母Z

JG

ABC1

;大于大写字母Z返回重新输入

MOV

DL,AL;将AL内容送DL,作为输入参数

MOV

AH,02;置显示输出

INT21H

;将A~Z的字符从显示器输出

ABC2:MOV

AH,4CH

;带返回码结束INT21H

INT21H条件程序设计条件程序设计在汇编语言程序设计中,根据各种条件判断和比较进行操作,满足条件去做一种操作,不满足条件去做另一种操作。每一种操作程序称为一个分支,一次判断产生两个分支,只有一次判断的称为单重分支程序。多次判断产生多个分支,称为多重分支程序。分支程序结构框图如图所示。

在汇编语言程序设计中,常常要使用多分支结构。多分支结构相当于一个多路开关,在程序设计中通常是根据某寄存器或某单元的内容进行程序转移。在设计多分支转移程序时,如果分支太多,则平均转移速度太慢。如果用转移地址表实现多分支转移,则可以提高平均转移速度。多分支结构如图所示。条件程序设计条件程序设计实现表达式XYY=1(X>0)0(X=0)-1(X<0)X在-128~+127之间波形图条件程序设计流程图条件程序设计数据段定义

DATASEGMENTXDB?YDB?DATAENDS代码段定义

CODESEGMENTASSUMECS:CODE;DS:DATAMAINPROCNEARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;标准写法条件程序设计

MOVAL,XCMPAL,0JGEBIGER;X大于等于0转BIGERMOVAL,0FFH;-1的补码为FFHMOVY,AL;Y=-1JMPNEXTBIGER:JEEQUL;X等于0转EQULMOVAL,1MOVY,AL;Y=1JMPNEXTEQUL:MOVY,AL;Y=0NEXT:R

温馨提示

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

评论

0/150

提交评论