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

下载本文档

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

文档简介

第3章汇编语言程序设计3.1概述3.2汇编语言源程序的格式3.3

伪操作命令3.4DOS和BIOS调用3.5

汇编语言程序设计举例1三种层次的计算机语言:机器语言:用二进制数表示指令和数据,计算机可直接理解和执行,速度快,占用内存少,但不直观,不宜理解和记忆。汇编语言:用助记符来书写指令,地址、数据也可用符号表示,执行速度快,编写、阅读和修改比较方便,需要汇编成机器语言。高级语言:不针对某个具体的计算机,通用性强。不需要了解计算机内部的结构和原理,易读、易编,需要编译成机器语言。3.1概述2汇编语言:一种采用助记符表示的程序设计语言,即用指令助记符表示指令的操作码和操作数,用符号或标号表示地址、常量或变量,与机器代码相对应。汇编语言源程序:用汇编语言编写的程序。宏汇编程序MASM.EXE功能:检查源程序中语法的正确性,将汇编语源程序翻译成由机器代码组成的目标程序。

汇编语言源程序目标程序

汇编程序MOVAX,100H→B800013汇编语言上机环境4例:有两个5字节数3B74AC60F8H、20D59E36C1H分别放在自DATA1和DATA2开始的存储区中,低字节在低地址处,编一程序段将两数相加,结果存放于从DATA1开始的单元中。 MOVCX,5 ;循环次数 MOVSI,0 ;偏移值 CLC ;CF=0LPER:MOVAL,DATA2[SI] ADCDATA1[SI],AL INCSI DECCX JNZLPER ….3.2汇编语言源程序的格式5汇编语言源程序的格式DATA

SEGMENT;定义出必要的数据,以及数据存放空间DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数DATA2DB 0C1H,36H,9EH,0D5H,20H ;加数DATA

ENDSCODE

SEGMENT

;定义代码段

ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA;指令序列,构成代码段

MOV DS,AX ;初始化DS

MOV CX,5 ;循环次数 MOV SI,0 ;偏移值 CLC ;CF=0LPER:MOV AL,DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LPER

MOV AH,4CH INT 21H ;返回DOSCODE

ENDS

END

START6汇编语言的两种基本语句(1)指令性语句也称可执行性语句,表示为CPU指令系统中各种用助记符表示的机器指令。这些指令在汇编过程中最终转换为目标程序的机器代码,在运行该程序时被执行。例MOVAX,100H→B80001(2)指示性语句(伪指令语句)指示汇编程序进行汇编的操作,例如用来定义变量,分配存储单元,指示程序开始和结束等。这些指令在汇编过程中被执行,指示相应的汇编操作,其自身并不产生任何目标代码。如伪指令。一个程序经汇编、连接和装入内存后,在执行程序之前,指示性语句的功能已经完成,故又称伪操作;而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。7汇编语言语句组成

[名字]操作码/伪操作[操作数][;注释]分为4部分,各部分之间至少要用一个空格作为间隔。

操作码是一个助记符,它可以是指令、伪指令(又叫伪操作)或宏指令。操作数由寄存器、存储单元、数据项或其表达式构成。汇编时一个表达式得到一个值。注释用来说明程序或语句的功能,用分号;作为注释开始。其中名字和注释视情况而定,可有可无。LP:ADDAL,[SI];AL+[SI]→AL…JNZLPLP1: REPMOVSB INC AL ADDAL,BL8⒊2.3名字(标号或变量)名字是由程序员建立起来的有特定意义的字符系列,由英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。1)标号符号地址,表示一条指令所在的地址,常用作转移指令(包含子程序调用指令)的操作数,即目标地址。9标号的三个属性:(1)段属性(SEGMENT):表示标号所在段的段地址(2)偏移属性(OFFSET):表示标号的偏移地址(3)距离属性(类型属性TYPE):表示标号作为段内或段间的转移属性距离属性分为两种:NEAR(近):表示本标号只能被标号所在段内的转移和调用指令访问(即段内转移)。FAR(远):表示本标号可以被其他段(不是标号所在段)的转移和调用指令访问(即段间转移)。102)变量名、段名、过程名变量——通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。变量的三个属性:(1)段属性(SEGMENT):表示变量所在段的段地址,常常放在DS或ES寄存器中。(2)偏移属性(OFFSET):表示变量的偏移地址(3)类型属性(TYPE):表示变量占用存储单元的字节数。

类型:字节,字,双字,四字,十字节类型,变量名——表示数据在段中的有效地址,由用户指定。变量名是可选的,如果使用变量名,它代表数据区中第一个数据项的地址。113.2.4助记符和伪操作助记符(指令性语句):指令系统中的助记符。伪操作(指示性语句)123.2.5操作数常数、寄存器、标号、变量和表达式

1.常数

常数——没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化。它可以有以下几种类型:⑴二进制数:以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B。⑵八进制数:以字母O或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、⑶十进制数:由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略字母D。例如:1234D或1234。13⑷十六进制数:以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且必须以数字开头。例如:56H,0B3FH。⑸字符串常数:用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。例如‘A’的值是41H,而‘B’的值是42H。注意:为了区别由A~F组成的一个字符串是十六进制数还是英文符号,规定凡以字母A~F为起始字符的十六进制数,必须在前面冠以数字“0”。142.寄存器8位寄存器:AH,AL,BH,BL,CH,CL,DH,DL16位寄存器

:AX,BX,CX,DX,SI,DI,BP,SP,DS,ES,SS,CS,IP3.标号符号地址,可以作为转移、过程调用以及循环控制等指令的操作数。4.变量(存储器操作数)155.表达式与运算符表达式地址表达式:产生的结果是一个存储器地址,若该地址存放的是数据,一般称它为变量,若存放的是指令,一般称它为标号.数值表达式:只产生数值结果16运算符主要包括以下6种类型:

1)

算术运算符

包括:+、-、*、/、MOD(求余)、SHL(左移)和右移(SHR)例:CONT=14*4

CONT=CONT/8

MOVAL,21HSHL22)逻辑运算符

包括:AND、OR、XOR和NOT。只适用于对常数进行逻辑运算。例:ANDDX,0AFHAND0F0H173)关系运算符包括:EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。结果:若关系为假(不成立),结果为0;若关系为真(成立),结果为0FFH或0FFFFH。例:MOVBX,2LT5;BX=0FFFFH例:MOVAX,4EQ3;AX=0184)分析运算符分析运算符用以分析一个存储器操作数的属性,如段、偏移量或类型等;⑴取地址的偏移量格式:OFFSET变量名或标号功能:取变量名或标号所在段的段内偏移量。MOV SI,OFFSETDATA1⑵

取段地址格式:SEG变量名或标号功能:取变量名或标号所在段的段地址。MOV AX,SEGDATA1MOV DS,AX注意:SEG、OFFSET只能对符号地址操作MOV

BX,OFFSET[SI]×MOVAX,

SEG[BX]

×19⑶求变量名或标号的类型值格式:TYPE变量名或标号功能:返回一个数字值。若TYPE加在变量名前,返回该变量的类型属性;若加在标号前,返回该变量的距离属性。属性类型值变量BYTE1WORD2DWORD4标号NEAR-1FAR-2存储器操作数的类型值20⑷求长度格式:LENGTH变量名功能:返回一个变量名所占存储单元(字节、字或双字)的数目。若变量是用重复定义子句说明的,则返回DUP前面的数值;其余返回1。⑸求大小格式:SIZE变量名功能:返回变量名所占存储单元的字节数,它等于LENGTH和TYPE两个运算符返回值的乘积。215)合成运算符合成运算符可以规定存储器操作数的某个属性,如类型(1)PTR运算符格式:类型PTR表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令内有效。例:MOVBYTEPTR[DI],4;指明目的操作数为字节类型JMPDWORDPTR[BP];指明目的操作数为双字类型BYTE,WORD,DWORD,FAR,NEAR存储器操作数

例:TWO_BYTEDW?…MOVBL,BYTEPTRTWO_BYTE22(2)

THIS运算符*格式:THIS类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。例如,要求对同一个数据区,既可以字节作为单位,又可以字作为单位进行存取。AEQUTHISBYTEBDW20DUP(?)

说明:A、B对应同一存储器地址,对变量A为字节访问,对变量B为字访问,且A和B具有相同的段基址和偏移量。 23(3)

SHORT运算符*格式:SHORT标号功能:当转移的目标地址与本转移指令的下一条指令之间的字节距离在-128~127范围时,可以用SHORT运算符进行说明。例10:L1:JMPSHORTL2┇L2:MOVAX,BX┇

246)其他运算符

⑴HIGH和LOW运算符*格式:HIGH表达式

LOW表达式功能:从运算对象中分离出高字节或低字节。例:K1EQU1234H MOVAL,LOW K1;AL←34HMOVBL,HIGHK1;BL←12H(2)段超越运算符:MOV AX,ES:[SI]25(3)方括号[]运算符指令中用方括号表示存储器操作数,方括号的运算规则说明如下:①方括号的内容表示存储器操作数的偏移地址;②有多对方括号顺序排列时,操作数的偏移地址等于各方括号内容之和;③一个常量后面跟有方括号时,操作数的偏移地址等于该常量与方括号内容之和;④一个变量后面跟有方括号时,操作数的偏移地址等于该变量的偏移地址与方括号内容之和。例如:

MOVAL,CONST[BX] ;AL←[BX+COUNT] MOVSI,4[BX] ;SI←[BX+4] MOVAL,[BX][SI][-5] ;AL←[BX+SI-5]不允许BX和BP同时出现在同一个地址表达式的方括号里;不允许SI和DI同时出现在同一个地址表达式的方括号里;若方括号内包含基地址指针BP,则隐含使用SS提供段地址,否则均隐含使用DS提供段地址。26运算符的优先级见P144表3.23.2.6注释注释前面要求加上分号(;),如果注释的内容较多,超过一行,则换行后前面还要加上分号,273.3伪操作命令指令语句:给CPU的命令,在汇编过程中被翻译成相应的目标代码,经连接后生成可执行的机器指令代码。伪指令语句:给汇编程序的命令,在汇编时被解释执行,如数据定义,分配存储器等。

在伪指令语句的前面,可以是常量名、变量名、段名和过程名等。标号后用“:”——在指令语句中表示该语句的伪操作功能。定义符由汇编程序规定,宏汇编程序中使用了数十种定义符。可以是常数(二、十、十六进制等)、字符串、常量名、变量名、标号和一些专用符号等。

任选字段,必须以分号开始,和指令语句的注释的功能一样。

伪指令语句的格式

格式:符号名定义符操作数;注释283.3.2数据定义伪操作用途:定义变量类型,给存储器赋初值,或仅给变量分配存储单元,而不赋予特定的值。

格式:[变量名] DB 表达式 ;定义字节[变量名]DW 表达式 ;定义字[变量名] DD 表达式 ;定义双字 [变量名]DQ表达式 ;定义8个字节 [变量名] DT 表达式 ;定义10个字节 表达式——是赋给变量的初始值,可以有一个,也可以有多个,但不能超出数据类型范围。29⑴数值表达式实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。若要定义多个相同类型的数据,可用逗号把这些数据隔开,并依次分配在相邻的存储单元。例:BUF DB20H,30HBUF1 DW100DAT DW1234H,5678H56H78H12H34H00H64H30H20HBUFDATBUF130⑵ASCII字符串字符串必须用引号括起来,并且不超过256个字符,它们在内存中按地址递增顺序自左向右依次存放字符的ASCII码。例:STRINGDB‘ABC’STRING1DB‘Howareyou?’例:DATADB‘AB’

DATA1DW‘AB’

41H42H43H‘H’‘O’‘W’…?STRINGSTRING141H42HDATA42H41HDATA1注意:当定义和初始化多于二个以上字符串时,只能用DB,不能用DW,DD31⑶?——为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。例:RESULTDB?;预置一个字节单元,其值不定ABCDB12H,?,?,24HDEFDW?,895H,?12H24HABC95H08HDEF32⑷重复定义子句DUP——可以为若干个重复数据分配存储单元。格式:nDUP(表达式)说明:n:重复次数表达式:重复的内容

注意:(1)DUP操作可以嵌套。(2)在定义变量及存储单元的同时,也定义了它们的类型属性。同一数据定义语句所定义的各存储单元具有相同的类型。33[例]DAT1DB100DUP(10);预置100个字节单元,初值均为10↑↑重复次数重复内容

DAT2DB2DUP(5DUP(1),2)

表示DAT2有12个字节元素,这12个元素为1,1,1,1,1,2,1,1,1,1,1,2[例4-16]DAT1 DB 20HDAT2 DB ? DAT3 DW ? DAT4 DB ‘AB’ DAT5 DW ‘AB’ DAT6 DD ‘AB’ DAT7 DB 2DUP(20H)

20H20H0041H42H41H42H42H41H???20H

DAT1DAT2DAT3DAT4

DAT5DAT6DAT7

34dataSEGMENTyyDW-1,0fcHHEXTABDB30H,31H,32H,33HDB34H,35H,36H,37H,38HDB39H,41H,42H,43H,44HDB45H,46HdataENDSyyHEXTABFFFFFC00313536373839414243444546323334欲查出第10个元素,即’A’的ASCII码:LEABX,HEXTABMOV AL,0AHXLAT;AL=41H3035例2:定义字符串变量

dataSEGMENT

str1DB'TsingHua'

str2DB'INPUT:',0dH,0aH,'$'dataENDS注意:3个及其以上的字符,只能用DB定义str1DW‘abcd’str2DD‘abcd’str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’36[例]BUF1DB100DUP(0) ;重复设置100个字节单元,内容都为0BUF2DW100DUP(20H);重复设置100个字单元,内容都为20HBUF3DD100DUP(13H);重复设置100个双字单元,内容为13H BUF4DB12H,34H,24H,33H

;设置4个字节单元,内容为12H,34H,24H,33H则 LENGTHBUF1=100 TYPEBUF1=1 LENGTHBUF2=100 TYPEBUF2=2 LENGTHBUF3=100

TYPEBUF3=4 LENGTHBUF4=1

TYPEBUF4=1 SIZEBUF1=100SIZEBUF2=200SIZEBUF3=400 SIZEBUF4=1MOVCX,SIZEBUF等价:MOVCX,200373.3.3符号定义伪指令(赋值语句)*功能:给一个符号重新命名,或定义新的类型属性等。

⑴等值伪指令格式:符号名EQU表达式功能:将表达式的值赋给符号名。例:ALFAEQU100COUNTEQUALFA注意:符号名一旦被EQU定义,就不能再用EQU重新赋值。(2)解除伪指令PURGE格式:PURGE符号名1[,符号名2…]功能:可以将用EQU定义的符号名解除,从而可以用EQU重新定义。例: PURGE ALFAALFA EQU 50H38(3)等号伪指令格式:符号名=表达式功能:将表达式的值赋给符号名。说明:可以在程序中不同的地方多次使用以重新为符号名赋值。例:ALFA=100 MOV AL,ALFA ;AL←100 ALFA=ALFA+2 ;ALFA=102 MOV AL,ALFA ;AL←10239(3)定义符号名伪指令格式:符号名LABEL 类型功能:定义一个标号或变量,并指定其类型。例: AREAW LABEL WORD AREAB DB 100DUP(?)┆

MOV AREAW,AX

MOV AREAB[49],AL;AL送第50字节

ABCFLABELFAR ;ABCF为FAR类型标号等价于:AREAW EQU THISWORD或MOVWORDPTRAREAB,AX40⒊3.4段定义伪指令

1.SEGMENT/ENDS段名SEGMENT[定位类型][组合类型][‘类别名’]┆段体 段名ENDS 功能:定义一个逻辑段,给逻辑段赋予一个段名,并以后面的任选项规定该逻辑段的其他特性。每个SEGMENT/ENDS可定义一个逻辑段。为该段起的名字,用来指出汇编程序为该段分配的存储器起始地址,开始的段名和结束的段名必须相同。段体为段内的语句序列412.段寄存器说明伪指令

格式:ASSUME段寄存器名:段名[,段寄存器名:段名…]功能:向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段的对应关系。注意:①本伪指令应放在可执行程序开始的位置②本伪指令只是指示各逻辑段使用寄存器的情况,并没有对段寄存器内容进行装填。段寄存器的实际值(CS除外)还要由MOV指令在程序中装填数据。③也可用来取消段寄存器与段之间的对应关系(用NOTHING),然后再建立新的对应关系。42例:ASSUMEDS:NOTHING

ASSUMEDS:DATAB

MOVAX,DATABMOVDS,AX 433.3.5过程定义伪指令

过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。格式:过程名PROC[NEAR/FAR] ┇过程体

RET

过程名ENDP自定义符,开始、结束要相同;有三个属性(段地址,偏移地址和距离属性)可有多个RET,一般作为最后一条指令44例:CODESEGMENT ASSUMECS:CODE

APRCPROCNEARADDAX,BX…RETAPRCENDPSTAR:MOVAX,NOM

CALLAPRC……

CALLAPRC…….CODEENDSENDSTAR453.3.6模块定义与连接伪操作* 汇编语言可以把较大的程序划分成多个独立的源程序(或称模块),并对每个模块独立地进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。各模块之间可以相互进行符号访问。1.模块开始伪指令格式:NAME模块名功能:指明程序模块的开始,并指出模块名。说明:模块名是自定义符,不能是系统保留字。若该项缺省,则取TITLE语句中的页标题前6个字符;若没有TITLE语句,则取源程序文件名为模块名。462.模块结束伪指令(源程序结束伪指令)格式:END启动标号或过程名功能:END表示一个模块(源程序)的结束。通知汇编程序源程序到此结束,并给出执行程序的入口位置,END后面的标号表示程序执行的开始地址。例:START:MOV AX,DATA┇ENDSTART注意:1)END与NAME联合使用,当NAME缺省时,END值表示原程序的结束。2)汇编处理只进行到END为止。473.PUBLIC格式:PUBLIC符号[,…]功能:说明本模块中的某些符号是公共的,即这些符号可以提供给将被连接在一起的其他模块使用。PUBLIC伪操作可以安排在源程序的任何地方。注意:符号可以是本模块中定义的变量、标号或数值的名字,包括过程名等。4.EXTRN格式:EXTRN名字:类型[,…]功能:说明本模块中所用的某些符号是外部的。必须是其他模块中用PUBLIC定义的符号必须与定义这些符号的模块中的类型说明一致48[例3.3]主程序和被调用的过程以及引用的变量不在同一模块中。*;主模块DATA1 SEGMENTBUFFER DW100DUP(?)DATA1 ENDSDATA2 SEGMENT EXTRN ALA:BYTE,BETA:WORDDATA2 ENDSCODE1 SEGMENTEXTRN SBRT:FARASSUMECS:CODE1,DS:DATA1,ES:DATA2START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX … CALL SBRT …CODE1 ENDS END START;子模块PUBLICSBRTCODE2SEGMENTASSUMECS:CODE2 …SBRT PROC FAR …SBRT ENDP …CODE2 ENDS END;子模块2DATA2 SEGMENTPUBLIC ALA,BETAALADB50DUP(?)BETADW?DATA2 ENDS END49复习DB,DW,DDABDB‘ABC?’,0AH,?,20HARRAYDB100DUP(3DUP(8),6)ABWDW34H,5566HSEGMENTENDSASSUMECS:CODE,DS:DATAPROCENDPEND508.其他伪指令1)ORG伪指令(补充)格式:ORG表达式功能:将指令中的表达式的值定义为下一条指令的偏移地址值。例:ORG0100H;从0100H开始存放

ORG$+20;$为当前地址,从此地址后20字节处开始存放2)注释说明伪指令格式:COMMENT定界符注释定界符功能:用于在程序中加入注释,即定界符间的内容全部为注释。定界符—自定义的任意非空字符例:COMMENT/注释/51DATASEGMENTD0 DB10HD1 DB11H,22H,33H ORG0020HD2 DW5566H,7788H ORG$+2D3 DB23HDATA ENDS0001H1122330020H665588770026H230000H10ASSUMEDS:DATAMOV AX,DATAMOVDS,AX523.3.7宏处理伪指令*3.3.83.3.9*⒈

宏定义及其调用宏定义格式:宏指令名MACRO[形参,形参,┅]

┇宏体

ENDM宏调用的格式为:宏指令名[实参,实参,┅]53汇编语言源程序的结构一个标准的汇编语言源程序的框架结构:

DATASEGMENT┇ DATAENDSSTACKSEGMENTPARASTACK‘STACK’;┇ STACKENDS CODESEGMENT ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOVAX,DATA MOVDS,AXMOVES,AX

定义堆栈段及堆栈长度定义数据段定义代码段设置用户数据段,附加段54 MOVAX,STACK

MOVSS,AX

MOVAH,4CHINT21H

PRA PROCNEAR ┇PRAENDP┇ CODEENDS

ENDSTART 设置用户堆栈段返回DOS定义过程55DATA SEGMENTFIRST DB10,20,30,40SECONDDB50,60,70,80SUM DB5DUP(0)DATA ENDSCODE SEGMENT

ASSUMECS:CODE

ASSUMEDS:DATASTART:MOV AX,DATA MOV DS,AX

LEA SI,FIRST LEA BX,SECOND LEA DI,SUM MOV CX,4 CLCLP1: CALL ADDP INC SI INC BX INC DI LOOP LP1 ADCBYTEPTR[DI],0

MOV AH,4CH INT 21HADDP PROC NEAR MOV AL,[SI] ADC AL,[BX] MOV [DI],AL

RETADDP ENDP

CODE ENDS

END START伪指令补充例题:有两个4字节数分别放在自FIRST和SECOND开始的存储区中,低字节在低地址处,编一段程序段将两数相加,结果存放于从SUM开始的存储区中。563.4DOS和BIOS调用3.4.1概述DOS(DiskOperationSystem):是IBMPC及PC/XT的操作系统,负责管理系统的所有资源,协调微机的操作,其中包括大量的可供用户调用的服务程序,完成设备的管理及磁盘文件的管理。BIOS(BasicInputandOutputSystem):是IBMPC及PC/XT的基本I/O系统,包括系统测试程序、初始化引导程序、一部分中断矢量装入程序及外部设备的服务程序。57

软中断:INTn

当n=5~1FH时,调用BIOS中的服务程序;当n=20~3FH时,调用DOS中的服务程序。其中,INT21H是一个具有多种功能的服务程序,一般称之为DOS系统功能调用。583.4.2DOS软中断及系统功能调用1.DOS软中断(INT20H~INT27H)已不采用用户不能直接调用只适用于.COM文件592.DOS系统功能INT21H功能

设备管理:键盘输入、显示器输出、打印机输出、串行设备输入/输出、初始化磁盘、选择当前磁盘、取剩余磁盘空间。

目录管理:查找目录项、查找文件、置/取文件属性、文件改名等。

文件管理:打开、关闭、读/写、删除文件其他功能:中止程序、置/取中断矢量、分配内存、置/取日期及时间等。60DOS系统功能调用(INT21H)

INT21H是一个具有近90个子功能的中断服务程序,这些子功能的编号称为功能号。调用它们时采用统一的格式:1)功能号送入AH寄存器2)传送入口参数到指定寄存器中3)INT21H

4)分析出口参数61(1)键盘键入检查键盘状态——0BH号系统功能调用格式:MOVAH,0BHINT21H

功能:如果有键按下使AL=0FFH,否则AL=00H。例:有键按下则退出循环。LP1:… MOVAH,0BH INT21H INCAL JNZLP1;如无键按下,则循环 RET;有键入字符,则停止循环62键盘输入单字符——1号系统功能调用格式:MOVAH,1INT21H

功能:执行时,系统等待键盘输入,待按下任何一键,系统先检查是否是Ctrl—Break键。若是则退出,否则将键入字符的ASCII码置入AL中,并在屏幕上显示该字符。KEY:MOV AH,1 INT 21H CMP AL,’Y’ JE YES注意:7号、8号功能都可以直接接收键入的字符,将键入字符的ASCII码置入AL中,只是不回显。63键盘输入字符串——0AH号系统功能调用功能:将键盘输入的字符串写入到内存缓冲区中,必须事先定义一个缓冲区。缓冲区的第一个字节:用户定义的最大键入字符数。第二个字节:预留,由系统自动填写实际键入的字符数。从第三个开始:存放字符串,回车(0DH,不计入实际字符数)表示结束。格式:┇

BUFSIZEDB 25 DB ?CHARTEXTDB 25DUP(?) DB‘$’ ┇ MOVDX,OFFSETBUFSIZE MOVAH,0AH INT21H 注:若输入字符不足20个,则系统自动补0,若超过20个,则超出字符被丢弃,并响铃报警。64(2)显示器(CRT)输出输出单字符——2号系统功能调用

格式:MOVDL,‘A’ MOVAH,2 INT 21H 功能:将DL中的字符送屏幕显示。65输出字符串——9号系统功能调用

功能:将指定的内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串以“$”为结束标志。格式:

BUFDB ‘GOODBYE$’┇ MOVDX,OFFSETBUF MOVAH,9 INT21H

结果:显示GOODBYE66(3)打印机输出——5号系统功能调用

功能:打印一个字符格式:MOVAH,5 MOVDL,‘A’ INT21H注意:利用5号功能还可以改变打印机的打印方式DATA SEGMENTSTR DB1BH,45H;”加重打印”的控制码DATA ENDSCODE SEGMENT … MOV CX,2 MOV AH,5 LEA BX,STRPRINT:MOVDL,[BX] INT 21H INC BX LOOP PRINT67(4)

返回操作系统——4CH号系统功能调用格式:MOVAH,4CH INT21H(5)直接控制台输入/输出单字符——6号系统功能调用

功能:若DL=0FFH,表示从键盘输入单字符

AL若DL

0FFH,表示将DL内容屏幕显示输出。格式:

MOVDL,0FFH MOVAH,6 INT21H MOVDL,‘A’ MOVAH,6 INT21H 68

(6)从串口输入单字符——3号系统功能调用MOVAH,3INT21H功能:从串口读入一个字符,并把字符的ASCII码存入AL中(7)向串口输出单字符——4号系统功能调用

MOVDL,‘$’ MOVAH,4 INT21H69INT21HDOS系统功能调用70汇编语言源程序的结构一个标准的汇编语言源程序的框架结构:

DATASEGMENT┇ DATAENDSSTACKSEGMENTPARASTACK‘STACK’;┇ STACKENDS CODESEGMENT ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOVAX,DATA MOVDS,AXMOVES,AX

定义堆栈段及堆栈长度定义数据段定义代码段设置用户数据段,附加段复习71 MOVAX,STACK

MOVSS,AX

MOVAH,4CHINT21H

PRA PROCNEAR ┇PRAENDP┇ CODEENDS

ENDSTART 设置用户堆栈段返回DOS定义过程复习72INT21HDOS系统功能调用复习73补充:汇编语言和DOS操作系统之间的接口

*.ASMMASM*.OBJ*.LST*.EXELINK1.程序定位1)程序段前缀PSP(256个字节)存放所要执行的程序的有关信息,同时也提供了程序和操作系统的接口。2)定位(见右图)ES/DS→CS:IP→SS→

SP→┇

20HINT代码段数据段堆栈段PSP74结束用户程序返回DOS有两种方法:1:MOVAH,4CH;返回DOSINT21H2:INT20H;返回调用程序,它的机器码是CD20H,当用DEBUG调用EXE文件时,在DS:0000单元中便可看到该指令。75STACKSEGMENTSTACK

DW32DUP(?)

STACKENDS

DATASEGMENT

DATAENDS

CODESEGMENT

ASSUMECS:CODE,SS:STACK,DS:DATABEGINPROCFAR

START:PUSHDS

SUBAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

RET

BEGINENDP

CODEENDS

ENDSTART将程序段前缀PSP进栈返回到PSP,执行PSP中的第一条指令INT20H,结束程序返回调用程序763.5汇编语言程序设计举例程序设计步骤

1)分析问题2)建立数学模型3)确定算法4)绘制程序流程图5)内存空间分配

6)编制程序与静态检查7)程序调试

77绘制流程框图处理框判断框流向线起止框78顺序结构循环结构分支结构子程序结构复合结构:多种程序结构的组合……基本程序结构792.分支程序判定条件分支程序段2YN分支程序段1判定条件分支程序段YN判定条件程序段3条件2…条件n程序段2程序段1条件1简单分支结构多分支结构803.循环程序设计(1)循环程序的结构与组成开始初始化部分循环工作部分循环控制部分循环结束?结束处理部分结束NY开始初始化部分循环控制部分循环工作部分循环结束?结束处理部分结束NY当型循环(当条件成立进入循环)直到型循环(直到条件成立退出循环)81开始A→AL比较B和ALB>A?‘B’→DL‘A’→BL显示比较结果DL>BL结束‘A’→DL‘B’→BLYN例:在A和B单元各有一个8位无符号数,要求比较这两个无符号数,并根据比较结果在屏幕上显示A>B或B>A(假设这两个数不相等)。DATASEGMENTADB20HBDB92HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,ACMPB,AL

JABGAMOVDL,‘A’MOVBL,‘B’JMPDISPBGA:MOVDL,‘B’MOVBL,‘A’DISP:MOVAH,2INT21HMOVDL,‘>’INT21HMOVDL,BLINT21H

MOVAH,4CHINT21H

CODEENDS

ENDSTART82程序的编辑、汇编及连接过程DATASEGMENTADB20HBDB92HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:

MOVAX,DATAMOVDS,AXMOVAL,ACMPB,AL

JABGAMOVDL,‘A’MOVBL,‘B’JMPDISPBGA:MOVDL,‘B’MOVBL,‘A’DISP:MOVAH,2INT21HMOVDL,‘>’INT21HMOVDL,BLINT21H

MOVAH,4CHINT21H

CODEENDS

ENDSTART1.用任一文本编辑器编辑源程序,以后缀ASM保存,例如保存为C:\MASM6\COMPAB.ASM2.用MASM.EXE进行汇编,生成目标代码文件和列表文件COMPAB.OBJ,COMPAB.LST3.用LINK.EXE连接,生成可执行文件COMPAB.EXE4.连接无误,即可运行,否则可用DEBUG调试83程序的编辑、汇编及连接过程84COMPAB.LST85例:把0、1、2、3、4、5…9输出在屏幕上。CODESEGMENTASSUMECS:CODESTART:MOVCX,0AHMOVDL,30HDDD:MOVAH,02HINT21HINCDLDECCXJNZDDDMOVAH,4CHINT21HCODEENDSENDSTART86第二章作业2-18DATASEGMENTDATA1DB23H,34H,32H,45H,46H,68HDATA2DB33H,44H,55H,66H,77H,88HDATA3DB6DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX87 LEASI,DATA1 LEABX,DATA2 LEADI,DATA3 MOVCX,6 CLCLP1: MOVAL,[SI] SBBAL,[BX] MOV[DI],AL INCSI INCBX INCDI LOOPLP1 MOVAH,4CH INT21HCODEENDS ENDSTART88DATASEGMENTBUFFERDW23H,…MINDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX

LEASI,BUFFER MOVAX,[SI] MOVCX,99LP: ADDSI,2 CMP[SI],AX JNLNEXT MOVAX,[SI]NEXT: LOOPLP MOVMIN,AXSTOP:MOVAH,4CH INT21HCODEENDS ENDSTART开始SI指向BUFFER[SI]→AXCX=99地址指针指向下一个数:SI加2[SI]<AX?结束YN循环结束?YAX→MINN[SI]→AX作业2.2189P135作业2-22DATASEGMENTSTRING1DB23H,…STRING2DB33H,…DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX

90开始SI指向STRING1DI指向STRING2CX=100SI,DI各加1[SI]=[DI]?结束YNCX-1=0?YBL=0FFHNBL=00H

LEASI,STRING1 LEADI,STRING2 MOVCX,100LP: MOVAL,[SI] CMPAL,[DI] JZDENG MOVBL,0FFH JMPSTOPDENG:INCSI INCDI LOOPLP MOVAL,00HSTOP:MOVAH,4CH INT21HCODEENDS ENDSTART 91开始初始化,置地址指针取一个数零的个数加1是’$’?结束NY是零?NY是正数?NY正数的个数加1负数的个数加1修改地址指针作业2-2392 ORAL,AL JZLING JNS ZHSH INC MINUS JMP NEXTLING:INC ZERO JMP NEXTZHSH:INC PLUSNEXT:INC SI JMP LP1STOP:MOVAH,4CH INT21HCODEENDS ENDSTARTDATSEGMENTDATADB1,2,…,’$’PLUSDB0MINUSDB0ZERODB0DATENDSCODESEGMENTASSUMEDS:DAT,CS:CODESTART:MOVAX,DAT MOVDS,AX LEASI,DATALP1: MOV AL,[SI] CMPAL,’$’ JZ STOP93[例3.21]CRT上的电子钟编写一个8086/8088汇编语言程序,使程序运行后屏幕显示器成为一台电子钟。分析:首先在屏幕上显示提示符,要求键盘键入当前时间,然后每隔一秒使显示的秒值加1,达到60秒时使分值加1,秒值清零;达到60分时使小时值加1,分值清零;达到24小时则使小时值清零;。当键入CTRL-C时退出“电子钟”状态,返回DOS。9495要解决的问题:显示字符串:09号系统功能调用从键盘接收字符串:0AH号系统功能调用延时1秒:延时子程序ASCII码与BCD码的互换:十进制运算:美化显示窗口:设置光标位置、设置窗口位置及颜色:BIOS功能调用注意:通用功能可以设置成子程序或定义宏。96DATASEGMENTBUF1 DB'Currenttimeis:$'BUF2 DB10 DB10DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATACURSORMACROROW,CLM;设置光标位置MOV AH,2;2号BIOS功能调用MOV BH,0;BH=页号MOV DH,ROW;DH:DL=行:列MOV DL,CLMINT 10HENDM97WINMACROROWL,CLML,ROWR,CLMR,COLORMOV AH,6;设置窗口位置及颜色MOV AL,0MOV CH,ROWLMOV CL,CLMLMOV DH,ROWRMOV DL,CLMRMOV BH,COLORINT 10HENDM98;ASCII转换为压缩BCD码ASCBCDMACROREGINC BXINC BXMOV REG,[BX]MOV CL,4SHL REG,CLINC BXMOV AL,[BX]AND AL,0FHOR REG,ALENDM;压缩BCD码转换为ASCIIBCDASCMACROREGINC BXINC BXMOV AL,REGMOV CL,4SHR AL,CLOR AL,30HMOV [BX],ALINC BXMOV AL,REGAND AL,0FHADD AL,30HMOV [BX],ALENDM99INCBCDMACROREG,COUNT;BCD数加1MOV AL,REGINC ALDAAM

温馨提示

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

评论

0/150

提交评论