4.第四章 汇编语言程序设计及其运行_第1页
4.第四章 汇编语言程序设计及其运行_第2页
4.第四章 汇编语言程序设计及其运行_第3页
4.第四章 汇编语言程序设计及其运行_第4页
4.第四章 汇编语言程序设计及其运行_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 汇编语言的基本表达及其运行,本章主要教学内容 l 汇编语言和汇编程序的基本概念 l汇编语言源程序书写规则、语句格式及程序分段 l 伪指令语句的格式、功能及应用 lDOS 系统功能调用和BIOS中断调用 l 汇编语言源程序的建立、汇编、连接、调试及运行,第四章 汇编语言程序设计及其运行,本章教学目的及要求 理解汇编语言和汇编程序的概念、特点及其应用。 掌握汇编语言源程序的书写规则、语句的基本格 式、程序的分段结构。 熟悉汇编语言的基本表达、伪指令语句及其应 用。 熟悉汇编语言程序的上机运行、调试过程,掌握 基本操作技能。,4.1 汇编语言和汇编程序的基本概念,第四章 汇编语言程序设计及其

2、运行,4.2 汇编语言源程序书写格式,4.3 8086汇编语言中的标识符、表达式和运算符,4.6 汇编语言程序设计,4.4 伪指令语句,4.7 汇编语言程序上机过程,4.5 DOS系统功能调用和BIOS中断调用,4.1 汇编语言和汇编程序的基本概念 4.1.1 汇编语言 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。 用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字、寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和各种寻址方式编制出高质量

3、的程序,这种程序不但占用内存空间少,而且执行速度快。,4.1.2 汇编程序 用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。 有基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。 编缉程序 PROG.ASM 汇编程序 PROG.OBJ 连接程序 PROG.EXE,源文件,ASM,目的文件,LINK,可执行文件,目录,4.2 汇编语言源程序书写格式 4.2.1 汇编语言源程序的分段结构 通常,一个汇编源程序应该由3个逻辑段组成,即数据段、堆栈段和代码段。 每个逻辑段

4、以SEGMENT语句开始,以ENDS语句结束。整个源程序以END语句结束。 NAME1 SEGMENT 语句 NAME1 ENDS NAME2 SEGMENT 语句 NAME2 ENDS END,每个段以符号SEGMENT 作为段的开始,以ENDS 作为段的结束,两者都必须有名字,而且名字必须相同。,以下面具体例子说明一个完整汇编语言程序(2字相加)的结构,DATA SEGMENT ;定义数据段 DATA1 DW 0F865H ;被加数 DATA2 DW 360CH ;加数 DATA ENDS ;数据段结束 ; EDATA SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存

5、和区 EDATA ENDS ;附加段结束 ; CODE SEGMENT ;定义代码段 ASSUME CS:CODE, DS:DATA, ES:EDATA ;段分配伪指令ASSUME ,指明以上程序定义 ;的各段由哪个段寄存器寻址. START: MOV AX , DATA MOV DS , AX ;初始化DS MOV AX , EDATA MOV ES , AX ;初始化ES LEA SI , SUM ;和的偏移地址 SI MOV AX , DATA1,ADD AX , DATA2 ;两数相加 MOV ES:SI, AX ;和附加段SUM HLT CODE ENDS END START,4.2

6、.2 汇编语言源程序的语句类型和语句格式 1语句类型 8086宏汇编MASM使用的语句可以分成3种类型: 指令语句:这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。 指示性语句(伪指令语句):伪指令语句是为汇编程序和连接程序提供必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。 宏指令语句:宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令,可包括多条指令或伪指令 。,2语句格式 一般情况下,汇编语言的语句可以由以下几部分组成: 指令

7、性语句: 标号: 操作符 操作数 ;注释 指示性语句: 名字 操作符 操作数 ;注释 标号,它表示该指令所在存储单元的符号地址,后边加“:”。 名字,通常表示变量名、段名、过程名,后边不加“:” 。 注意:标号和变量都具备3种属性段属性、偏移属性及类型属性。 操作符可以是机器指令、伪指令和宏指令的助记符。 操作数字段是操作符的操作对象。操作符在完成相应的操作时要求有一系列的操作数。当有两个或两个以上的操作数时,各操作数之间用逗号隔开。 注释字段是以“;”开头的说明部分,可以用英文或者中文书写。注释字段是语句的非执行部分 。例如: START: MOV AX , DATA ;指令性语句 DATA

8、1 DB 11H,22H ,33H ;指示性语句,定义字节数据,“DB”是伪操作,目录,4.3 数据项、表达式和运算符 4.3.1 数据项 1.常量(Constant) 包括:数字常量和字符串常量。 数字常量: 十进制:如:13D 或13 二进制:10101110B 十六进制:81H,0F685H(以字母AF开始的十六进制数 ,前面加“0”) 字符串常量:用单引号括起来的一个或多个ASCII码字符.如AB。 2.标号(label) 标号不能与助记符或伪指令重名,也不允许数字打头. 标号3属性:段、偏移量、类型 段属性:标号所在段的段地址,程序引用一个标号,该标号应该在代码段。 偏移量:该段起始

9、地址到该标号地址之间的字节数,是16位无符号数。 类型:近标号NEAR,段内引用,地址为2字节;远标号FAR,其他段引用, 地址为4字节,3.变量(variable) 变量3属性:段、偏移量、类型 段属性:变量所在段的段地址,变量在存储器的数据段和附 加段。 偏移量:该段起始地址到该变量地址之间的字节数。 类型:BYTE(字节),WORD(字),DWORD(双字) 等 注意: 变量类型要与指令要求相符,如: MOV AX,VAR1 ; VAR1必须定义为字变量 MOV BL,VAR2 ; VAR2必须定义为字节变量 变量名指向该变量数据区的首地址,如: NUM DB 11H,22H,33H M

10、OV AL,NUM+2 ;把33H AL,4.3.2 表达式和运算符 在表达式中,运算符充当着重要的角色。 8086宏汇编有: 算术运算符、逻辑运算符、关系运算符、分析运算符和 综合运算符共5种。下面分别讨论5种运算符的作用: (1)算术运算符:(加法)、(减法)、*(乘法)、(除法)、 MOD(求余)、SHL(左移)、SHR(右移)共7种 【例】数组定义如下: ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV AX ,30*5 ;两整数相乘的积AX MOV CX ,(TRYARRAY) ;数组长度 CX 汇编时,计算表达式,形成指令如下: MOV AX ,150

11、MOV CX,8,表达式,呀!原来,表达式的计算,在汇编时就完成了,(2)逻辑运算符:逻辑运算符的作用是对其操作数进行按位操作。逻辑运算符有AND(与)、OR(或)、XOR(异或)和NOT(非)。 【例】 MOV AL ,NOT 0FFH MOV CH ,8CH XOR 73H 汇编时,计算表达式,形成指令如下: MOV AL ,0 MOV CH ,0FFH,逻辑运算符与8086指令助记符AND、OR、XOR 、NOT 的符号完全相同,二者会混淆吗?,放心吧,不会的! 运算符是在汇编时进行的,而指令助记符是在程序执行时进行的,(3)关系运算符:关系运算符的运算对象是两个性质相同的项目。其结果为

12、:关系成立或不成立。有EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6种。 若结果为真,输出全1(0ffH 或0ffffH),若结果为假,输出全0。通常关系运算符与逻辑运算符组合起来使用,见下面例子: 【例】MOV AX , 10H GT 16 MOV BL , 6 EQ 110B MOV CX,(PORT LT 5)AND 100)OR (PORT GE 5)AND 200) 汇编后,形成指令如下: MOV AX ,0 MOV BL,0FFH MOV CX,100 ;当端口地址PORT 5 时 或 MOV CX ,200 ;当端口地址POR

13、T 5 时,(4)分析运算符:分析运算符也称数值返回运算符,是对存储器地址进行运算的。有5个:OFFSET(求偏移量)、SEG(求段基值)、TYPE(求变量类型)、LENGTH(求变量长度)和SIZE(求字节数)。 OFFSET 格式: OFFSET 变量或标号 【例】MOV BX, OFFSET NUM ;NUM是数据段中一个变量, ;汇编程序将变量NUM偏移地址BX 相当于指令 LEA BX ,SUM SEG 格式: SEG 变量或标号 【例】MOV AX ,SEG VAR1 MOV DS ,AX VAR1是段名为DATA数据段中的一个变量,假如DATA段从0500H开始,该指令把0500

14、H作为立即数在连接时插入指令,汇编成: MOV AX,0500H MOV DS ,AX, TYPE 格式: TYPE 变量或标号 TYPE加在变量前,返回变量的类型属性,加在标号前返回标号的距离属性 【例】 A1 DW 0438H,30H A2 DD ? L1: MOV AH ,TYPE A1 ADD AL ,TYPE A2 MOV BL ,TYPE L1 汇编时形成指令: MOV AH ,2 ADD AL ,4 MOV BL ,0FFH,表:TYPE运算符返回值, LENGTH 格式: LENGTH 变量 【例】 M1 DW 100 DUP(?) M2 DW 1,2,3 M3 DB A,B,

15、C,D MOV CX ,LENGTH M1 MOV BL ,LENGTH M2 MOV AL ,LENGTH M3 汇编时形成指令: MOV CX ,100 ;此变量包含100个字单元 MOV BL ,1 MOV AL ,1 当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其它变量返回,1 SIZE 格式: SIZE 变量 SIZE=LENGTH*TYPE,即返回变量包含的总字节数 【例】入上例定义的 M1,M2,M3 MOV CX ,SIZE M1 汇编时形成指令: MOV CX ,200 MOV BL ,SIZE M2 MOV BL ,2 MOV AL ,SIZE M3 MO

16、V AL ,1,(5)综合运算符:综合运算符又称为属性修改运算符。有6个综合运算符:段属性前缀、 PTR、THIS、 SHORT、 HIGH和LOW在程序运行过程中,通过属性修改运算符,改变量或标号的属性。 段属性前缀: 格式:段前缀: 变量或地址表达式。如:ES:BX PTR 格式:类型/距离 PTR 变量或标号 【例】LO: MOV BYTE PTR BX,10H ;BX 10H MOV WORD PTR BX,10H ;BX+1,BX 00 10H 也可用PTR改变距离属性: JMP FAR PTR LO ;可以把JMP安排在其它段中,实现段间转移。 THIS 格式: 变量/标号 EQU

17、 THIS 类型/距离 功能: 把THIS 右边的类型/距离属性赋给左边的变量/标号 ,该变量/标号的段地址和偏移地址与下一存储单元地址相同。,BYTE , WORD ,NEAR ,FAR,【例】 FIRST EQU THIS BYTE ; FIRST与TABLE段地址、偏移地址相同 TABLE DW 200 DUP(?) ;区别:FIRST是字节变量,TABLE是字变量 又如:SP1 EQU THIS FAR ; 标号SP1被赋予FAR属性, MOV AX,100 ;该语句前有标号SP1,允许其它段JMP到SP1地址 SHORT 格式: SHORT 标号 SHORT指出转移指令转向的目标地址

18、与本指令之间的距离在 -128 +127之间。 【例】 L1: JMP SHORT L2 L2: MOV AX , 0 HIGH 和 LOW 格式: HIGH /LOW 标号或变量 HIGH 和 LOW 称为字节分离运算符,对一个数或地址表达式,HIGH从中分离 出高字节,LOW从中分离出低字节。 【例】 K1 EQU 0ABCDH K2 EQU 1234H 汇编时形成指令: MOV AH ,HIGH K1 MOV AH ,0ABH MOV BL ,LOW K2 MOV BL , 34H,各类运算符和常数、寄存器名、标号、变量一起共同组成表达式。 在计算具有多个运算符的表达式值时,按以下规则操

19、作: l优先级高的先运算,优先级低的后运算。 l当优先级相同时,按表达式中从左到右的顺序进行运算。 l使用括号可以提高表达式运算的优先级。,优先级,1 (),LENGTH , SIZE 2 PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:SS:,ES: 3 HIGH , LOW 4 *, / , MOD , SHL , SHR 5 + , - 6 EQ , NE , LT , LE , GT , GE 7 NOT 8 AND 9 OR , XOR 10 SHORT,表. 运算符优先级,目录,4.4 伪指令语句 在汇编语言中,伪指令是给汇编程序的命令,由汇编程序(MASM)进行处

20、理。伪指令语句没有对应的机器代码。 例如定义变量、分配存储区、定义段、段分配及定义过程等都采用伪指令表示。 4.4.1 数据定义伪指令 数据定义伪指令用来定义一个变量的类型,并将所需要的数据放入指定的存储单元中,也可以只给变量分配存储单元,而不赋予特定的值。,1. 数据定义伪指令 格式1:变量名 伪指令 操作数 ,操作数 ;注释 格式2:变量名 伪指令 n DUP(操作数 ,操作数) ;注释 (n必须是正整数,表示括号中操作数的重复次数。 2. 常用的数据定义伪指令 定义字节变量伪指令DB 定义字变量伪指令DW 定义双字变量伪指令DD 定义四字变量伪指令DQ 定义十字节变量伪指令DT,【例1】

21、操作数是常数或表达式 DA1 DB 10H,52H ;变量DA1装入10H,52H DA2 DW 1122H,34H ;变量DA2装入 22H,11H,34H,00H DA3 DD 5*20H,0FFEEH ;变量DA3装A0H,00H,00H,00H,EEH,FFH,00H,00H 【例2】操作数是字符串 HELLO 的ASCII码 FIRST DB HELLO ; FIRST 开始的单元依次是:48H,45H,4CH,4CH,4FH SECOND DW OK ; SECOND开始的单元依次是:4BH,4FH 【例3】用?定义不确定值的变量; 用DUP定义重复变量。 ONE DB ? ;为变

22、量ONE保留1字节空间 TWO DW 3 DUP (0) ;重复3个0000H TREE DB 3 DUP(1,2DUP (20H) ) ;DUP嵌套,要记住存放顺序的区别吆! 另外,DW定义字串只 允许包括2个字符。,1 20 20 : : 1 20 20,TREE,重复三次,4F O,DB OK,4B K,DW OK,4F O,4B K,【例4】用已有的地址表达式定义变量,设已有标号(或变量)ADR1,ADR2。 ONE DW ADR1 ;将ADR1的偏移地址赋给字变量ONE TWO DD ADR2 ;将ADR2的偏移地址、段地址赋给双字变量two 假如ADR1、 ADR2在同一代码段,C

23、S=3000H,偏移地址分别为0100H,0200H 则汇编后存储器中变量存储格式如右下图所示: 【例5】变量的类型属性可以通过属性操作符PTR来指定. OPE1 DB 1,2 OPE2 DW 2233H,5566H MOV AX ,OPE1+1 MOV BL ,OPE2 MOV AX ,WORD PTR OPE1+1 ;AX=3302H MOV BL ,BYTE PTR OPE2 ;BL=33H,00 01 00 02 00 30,ONE TWO,ADR1偏移地址,ADR2偏移地址,ADR2段地址,这样做,可以通过汇编,? 请看 ,汇编器提示:错! 类型属性不匹配,4.4.2 符号定义伪指令

24、 符号定义伪指令的用途是给一个符号重新命名,这些符号可以包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。 常用的符号定义伪指令有EQU、,均不占内存. 1.赋值语句 EQU 格式: 符号名 EQU 表达式 程序中用到符号名 时就用表达式代替,但符号名一旦定义, 在同一程序模块中不能重复定义 【例】 COUNT EQU 100 ;常数值赋给符号 COUNT DATA EQU COUNT+2 ;表达式值赋给 DATA,但COUNT必须是已定义了的 A1 EQU BX+SI ;变址寻址单元内容赋给 A1 B1 EQU OFFSET A1 ;A1的偏移地址赋给 B1,但A1必须是已定义

25、了的 C1 EQU ADD ;加法指令赋给 C1 2.等号语句= =与EQU 有相同的功能,区别在于 =左边的标号允许重新定义: 【例】 A1=BX+SI , MOV AX,A1 , A1=BX , MOV CX ,A1,4.4.3 段定义伪指令 段定义伪指令的用途是在汇编语言程序中定义逻辑段,用它来指定 段的名称和范围,并指明段的定位类型、组合类型及类别。 常用的段定义伪指令有SEGMENT、ENDS和ASSUME等。 1.段定义语句:SEGMENT.ENDS 格式: 段名 SEGMENT 定位类型组合类型类名 段名 ENDS (1)定位类型(Align) 定位类型对该段起始地址定位。定位类

26、型有4种。 PARA(Pragraph) 说明逻缉段从一个节的边界开始,16个字节称为1个节,所以段的起始物理地址应为XXXX0H,缺省情况下,定位类型默认为PARA BYTE 说明逻缉段从字节边界开始,即从任何地址开始 WORD 说明逻缉段从字边界开始, 基本段起始地址必须是偶数。 PAGE 说明逻缉段从页边界开始,256字节为一页,故段的起始物理地址应 为XXX00H,(2) 组合类型(Combine) 组合类型用在具有多个模块的程序中,告诉汇编程序当一个逻缉段装入存储器时,它与其它段如何组合。组合类型共有6种。 NONE 表示本段与其它段不组合。即对不同程序模块中的段,即使段名相同,也作

27、为不同的逻缉段装入内存。缺省时,是NONE. PUBLIC 表示用PUBLIC说明的具有相同段名的逻缉段,汇编时把它们 组合在一起,构成一个大逻缉段。 STACK 与PUBLIC基本一样,仅限于堆栈段 COMMON 表示用COMMON说明的同名逻缉段,连接时从同一地址开始装 入,即各逻缉段重叠在一起,重叠部分内容是最后一个段的内 容,段长度=最长逻缉段的长度. MEMORY 表示当几个段连接时,本段定位在地址最高处,如果被连接的段中有多个 MEMORY,只将首先遇到的段作为MEMORY,而其余都当作COMMON段处理。 AT表达式 据表达式求值结果定位段地址。如AT 8000H,即本段起始 地

28、址为 8000H 。,(3)类名(CLASS) 类名必须用 括起来, 类名的作用是,当几个模块连接时将同类名的逻缉段组成一个段。 【例】将2个模块中同名段进行组合。 模块1: STACK SEGMENT STACK DB 100 DUP(0) STACK ENDS DATA SEGMENT COMMON AREA1 DB 1024 DUP(0) DATA ENDS CODE SEGMENT PUBLIC CODE ENDS 模块2: STACK SEGMENT STACK DB 50 DUP(0) STACK ENDS,DATA SEGMENT COMMON AREA1 DB 8192 DUP

29、(0) DATA ENDS CODE SEGMENT PUBLIC CODE ENDS 汇编连接后,存储器分配如下图示:,模块1代码 模块2代码,模块1堆栈段,模块2堆栈段,CODE,DATA (共8192字节),模块1数据段(被覆盖),模块2 数据段,2.段分配语句(ASSUME) 格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名 8086/8088存储器采用分段结构,各段容量 64KB,可设置多个逻缉段,但只允许4个段同时有效(1个代码段,1个数据段,1个堆栈段,1个附加段)。 ASSUME放在代码段开始,不可省略,他告诉汇编器,已定义过的段名分配给哪个段寄存器。 【例】

30、代码段初始化编程: CODE SEGMENT PUBLIC CODE ASSUME CS:CODE,DS:DATA,ES:EDAT,SS:STACK MOV AX ,DATA MOV DS ,AX ;数据段初始化 MOV AX ,EDAT MOV ES ,AX ;附加段初始化 MOV AX ,STACK MOV SS ,AX ;堆栈段初始化 CODE ENDS,CS不要程序员 赋初值, 汇编时,自动将 代码段的段地址装入,4.4.4 过程定义伪指令 在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。 使用格式: 过程名 PROC NEAR/FA

31、R (语句系列) RET 过程名 ENDP 调用一个过程的格式为: CALL 过程名,【例1】远过程定义及调用格式 MCODE SEGMENT MAIN: SPD PROC FAR;过程定义,属性:远过程 ;子程序体 RET SPD ENDP CALL SPD ;同一段内调用 MCODE ENDS NCODE SEGMENT ;另一段NCODE CALL SPD ;远过程调用 NCODE ENDS END MAIN,【例2】过程嵌套调用格式 MSUB PROC FAR CALL SUB1 RET SUB1 PROC NEAR ;SUB1子程序体 RET SUB1 ENDP MSUB ENDP,

32、例4.28 DATA SEGMENT ONE DB 22H,33H,44H,55H TWO DB 55H,66H,77H,88H SUM DB 20 DUP(?) DATA ENDS STACK SEGMENT STACK STT DB 100 DUP(?) TOP EQU LENGTH STT STACK ENDS CODE SEGMENT START: MOV AX,STACK MOV SS,AX MOV SP, TOP MOV AX,DATA MOV DS,AX ;设置数据段 MOV ES,AX ;设置附加段与数据段为同段 LEA SI,ONE ;LODSB指令用 LEA BX,TWO

33、LEA DI,SUM ;STOSB指令用,CLD ;方向标志 CLC ;进位标志清0,以便最低位加法也使用ADC指令 MOV CX,4 LL:CALL ABC LOOP LL ; MOV DI,DL ;将最高位进位考虑到和中 MOV AH,4CH ;返回DOS INT 21H RET ABC PROC LODSB L1: ADC AL,BX DAA STOSB INC BX RET ABC ENDP CODE ENDS END START,4.4.5 结构定义伪指令 结构就是相互关联的一组数据的某种组合形式。例如学籍管 理,每个学生项有姓名、年龄、性别、学科、成绩等,各变量 长度各不相同。汇编

34、程序提供了自定义数据结构的伪指令。 结构定义语句的使用分三步:结构定义,结构预置及结构的引用 1.结构定义(STRUC ENDS) 格式:结构名 STRUC (数据定义语句序列 DB,DW,DD,DQ,DT) 结构名 ENDS,【例1】定义一个数据表TAB的结构 TAB STRUC T1 DB ABCD ;字符串变量 T2 DW ? ;简单变量 T3 DW SEG L1 ;简单变量 T4 DW 2 DUP(0) ;多重变量 T5 DW 1122H,3344H ;多重变量 TAB ENDS 2.结构预置 格式1:结构变量名 结构名 格式2:结构变量名 结构名 N DUP() * 结构变量名-程序

35、中具体使用的结构型变量名 * 结构名-预置前已定义过的结构名 * -专用运算符 * 成员值表-对结构变量中的成员(变量)置初值, 如与定义时的初值相等,用逗号空出相应位置。 * 格式2,表示要连续预置N个相同的结构变量,【例2】对【例1】的TAB预置 ONE TAB ;不修改结构定义时的初值 TWO TAB ;修改第一个元素为STOP,其余不变 THREE TAB ;只修改第2,3元素 FOUR TAB 5 DUP ;只修改第1,2元素。 ;对变量FOUR连续预置5个相同的结构.,结构定义后,未分配存储 空间,结构预置后才确定 存储单元,3.结构的引用 经过结构定义和结构预置后,结构变量就能像

36、一般变量一样使用。 引用格式如下: (1)结构变量名 .结构成员名 (2)先将结构变量的偏移地址 地址寄存器,再按如下格式引用。 地址寄存器 .结构成员名 【例3】在【例2】的基础上,把AX内容写入结构体变量TWO的成 员T2中. MOV TWO.T2 , AX 【例4】将【例2】中的变量FOUR .T50送到BX寄存器 方法(1): MOV BX , FOUR .T50 方法(2): MOV SI , OFFSET FOUR MOV BX , SI .T50 结果(BX)=1122H,4.4.6 模块定义/连接伪指令、程序计数器$伪指令 在编写规模较大的汇编语言源程序时,可以将整个程序划分为

37、几个独立的源程序,称之为模块。 将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。 为了进行模块之间连接和实现相互的符号访问,以便进行变量传送,通常使用以下几个伪指令: ORG、END、PUBLIC、EXTRN。,1.ORG 格式: ORG 表达式 功能:指定下面语句的起始偏移地址. 【例】用ORG改变数据段地址 DATA SEGMENT ORG 100H A1 DB 10H,20H,30H ;A1的偏移地址为100 ORG 200H A2 DW 3031H,3233H ;A2的偏移地址为200H DATA ENDS 2.END 格式: END 标号 功能:标记

38、汇编源程序结束,每个源程序只有 一个END。标号-是程序中第一条可执 行语句的标号,若一个程序有多个模块, END后面的标号为主程序的标号,【例】 CODE SEGMENT START: SUB1 PROC NEAR RET SUB1 ENDP CODE ENDS END START,3.外部伪指令 程序中包含多个模块时,有些程序或数据 在模块间要相互共享。 PUBLIC:定义共享模块,EXTRN:调用共享模块 (1)PUBLIC 格式: PUBLIC 名称,名称, 名称:本模块已经定义过的变量、标号、常数 (2)EXTRN 格式: EXTRN 名称:类型,名称:类型, 名称-其它模块用PUB

39、LIC定义过的变量、标号 或常数. 类型-若名称是变量,则类型为BYTE/WORD 若名称是标号,则类型为NEAR/FAR 若名称是常数,则类型为ABS。 【例】模块1 DATA SEGMENT A1 DB 30H,31H A2 DW 4 DUP(0) A3 EQU 0011H DATA ENDS,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX ,DATA PUBLIC A2,A3 ;可供其它模 ;块调用 CODE ENDS 模块2 PDATA SEGMENT P1 DB 0AH,0BH PDATA ENDS PCODE SEGMENT AS

40、SUME CS:PCODE DS:PDATA EXTRN A2:WORD,A3:ABS MAIN: MOV AX ,PDATA MOV AX,OFFSET A2 MOV CX,A3 PCODE ENDS END MAIN,字符“$”在8086宏汇编中具有一种特殊的意义,把它称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。 在程序中,“$”出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。 【例1】 DATA SEGMENT A1 DB 10H,20H,30H C EQU $-A1 DATA ENDS $的偏移地址是03H , C=03H-00H=03H,【例2】

41、 DATA SEGMENT ORG 2 VAR1 DB 3,4,5 ;VAR1偏移地址02H ORG $+3 ;$偏移地址05H,- - 03 04 05 - - - 34 12,8, VAR1, VAR2,看看,动手画画 VAR1、$、VAR2 的内存分布图吧, 要学会它,就得动手动脑!,0,1,2, 5, $,VAR2 DW 1234H ;VAR2偏移地址08H DATA ENDS,9,4.程序计数器$,5.对准伪指令,格式: EVEN 功能:使下一语句的地址调整为偶地址。 例. DATA SEGMENT X1 DB 0DH EVEN X2 DW 100 DUP(?) DATA ENDS

42、若X1偏移地址=100H,如果没加入EVEN,X2的100个字 就从地址101H开始,而加入EVEN, X2的100个字就从 地址102H开始。,目录,4.5 DOS系统功能调用和BIOS中断调用,操作系统 MS - DOS 的结构,用户,用户程序,命令处理模块,磁盘管理模块,基本输入输出模块,软件中断和,系统调用,键盘命令,COMMAND.COM,IBM DOS.COM,IBM BIO.COM ROM BIOS,(一)、DOS系统功能调用(INT 21H)DOS功能调用可完成对文件、设备、内存的管理。,1. 系统功能调用的方法 (1)系统功能号送入AH寄存器中; (2)将入口参数送到指定寄存

43、器中; (3)使用INT 21H指令执行功能调用; (4)分析出口参数。 2. 常用的几种系统功能调用 (1)AH01H ;带显示的键盘输入 (2)AH0AH ;字符串输入到缓冲区 (3)AH02H ;从显示器上输出单个字符 (4)AH09H ;在显示器上输出字符串 (5)AH =4CH ;返回操作系统,(1) 键盘输入单字符并显示 功能号:01H,无入口参数。 MOV AH ,01 INT 21H 功能:等待键入,检查是否是Ctr - Break键,是,退出。不是将键入的字符送 AL 寄存器并显示。 【例】从键盘输入一个“Y”或“N”字符。 KEY: MOV AH,1 ;功能号1 AH IN

44、T 21H ;按下键后,字符的ASCII码AL CMP AL,Y ; 是“Y”? JE YES ;是,转YES语句去处理 CMP AL,N ; 是“N” ? JE NOT ;是,转NOT语句去处理 JMP KEY ; ;都不是,转KEY,继续等待键盘输入 YES: NOT: KEY:,(2)键盘输入字符串,功能号:0AH,入口参数:DS:DX = 缓冲区首地址 功能:将键盘键入的以 ENTER (0DH)结尾的字符串写到 DS:DX指定的内存区。为此,先设置一内存缓冲区。 BUF DB 20 ;缓冲区第一字节指出能容纳的最大字符数(含0DH) DB ? ;第二个字节空出,由DOS最后填实际长度

45、(不含0DH) DB 20 DUP (?) ;第三字节开始存放从键盘接收的字符 MOV DX ,OFFSET BUF MOV AH , 0AH INT 21H 注:键入字符超出缓冲区范围,超出的字符丢失且响铃警告,若小于设置范围,保持原来内容。,14H,? H,41H,0DH,.,BUF + 0 1 2,22,实际长度19,【例】开辟一缓冲区,从键盘输入一字符串,将输入的字符数 CL寄存器,并将指针指向字符串的第一字符。 DATA SEGMENT BUFF DB 100 ;定义缓冲区存放字符个数(100) DB ? ;由系统填入实际输入字符数 DB 100 DUP(?) ;第三字节开始存放从键

46、盘接收的字符ASCII码 DATA ENDS CODE SEGMENT MOV AX ,DATA MOV DS ,AX MOV DX ,OFFSET BUFF MOV AH ,0AH INT 21H MOV BX ,DX MOV CL ,BX+1 ;字符个数 CL寄存器 ADD DX ,2 ;指针DX指向字符串的第一个字符 ,(3)输出单字符,功能号:02H, 入口参数:DL 功能:将DL的内容显示(DL = 待输出字符的ASII码), 光标随字符移动 MOV DL ,A MOV AH,02 INT 21H 程序执行后,在显示器光标处显示字符 A 功能号:06H, 入口参数:DL 功能:将DL

47、的内容显示(DL) 0FFH),光标随字符移动 MOV DL ,24H ; “$”的ASCII码 MOV AH,06 INT 21H 程序执行后,在显示器光标处显示字符 “$”,(4)输出字符串 功能号:09H, 入口参数:DS:DX(缓冲区首地址) 功能:将缓冲区内以$结尾的字串显示,$不显示。若要显示 字符串后光标自动回车换行, 屏幕上显示HOW DO YOU DO ?,且光标换行 ,(5)返回操作系统,功能号:4CH , 无入口参数。 MOV AH ,4CH INT 21H 结束当前程序,返回操作系统。 (6)设置中断向量 功能号:25H ,入口参数:AL = 中断类型号 DS:DX =

48、 中断程序入口地址。 【例】若中断类型号是 40,中断程序入口地址 300:2400H,装中断向量。 MOV AX ,300H MOV DS ,AX MOV DX ,2400H MOV AH ,25H MOV AL ,40 INT 21H,(二)BIOS中断调用 IBM PC系列微机在只读存储器中提供了BIOS基本输入输出系统,它占用系统板上8K字节的ROM区,又称为ROM BIOS。 BIOS为用户程序和系统程序提供主要外设的控制功能,如系统加电自检、引导装入及对键盘、磁盘、磁带、显示器、打印机、异步串行通信口等的控制。每个功能模块的入口地址都在中断矢量表中,通过中断指令INT n可以直接调

49、用。n是中断类型号,每个类型号n对应一种IO设备的中断调用,每个中断调用又以功能号来区分其控制功能。 BIOS中断类型,请查阅书本上的介绍。 (1)显示中断调用 INT 10H INT10H可以进行屏幕设置。 功能号:存放在AH寄存器中,入口参数存放在指定寄存器中。 有关显示中断调用 INT 10H及显示属性等,请查阅有关书本上的介绍。,【例1】置光标到0显示页的(20,25)位置并以正常属性显示 一个*。 MOV AH ,2 ;功能号2,设置光标位置 MOV BH ,0 ;Page 0 MOV DH ,20 ;row=20 ,20行 MOV DL ,25 ;column, 25列 INT 1

50、0H ;video ROM call MOV AH ,9 ;功能号9,在光标处写字符/属性 MOV AL ,* MOV BH ,0 ;Page 0 MOV BL ,7 ;normal attribute,属性:黑底白字 MOV CX ,1 ;字符重复次数=1 INT 10H ;显示ROM调用,(2)串行口通讯功能调用 INT 14H 功能号:存放在AH寄存器中,入口参数/出口参数 存放在指定寄存器中。如下表所示: 通讯口号(COM1=0,COM2=1),数据准备好,串口状态字,0-成功 1-失败,【例】从通讯口0读入字符并显示出来,如字符没准备好就等待,如传送出错则显示错误信息? CHECK:

51、 MOV AH,3 ;读串口状态 MOV DX,0 ;COM1 INT 14H ;串口功能调用 AND AH, 1 ;字符准备好? JZ CHECK ;NO,继续读串口 MOV AH,2 ;YES,读串口 MOV DX,0 INT 14H TEST AH,80H ;读字符正确吗? JNZ ERR ;NO,显示出错信息 AND AL,7FH ;正确,取字符 MOV BX,0 ;显示字符 MOV AH,0EH ;显示功能号AH INT 10H ;显示中断调用,JMP CHECK ;检查并读下一字符 ERR: MOV AL, ? ;显示字符? MOV BX, 0 MOV AH, 0EH ;显示功能号

52、AH INT 10H ;显示中断调用,(三)返回DOS的方法及中断调用(INT 20H,INT 21H),1. DOS软中断(INT 20H INT 27H) INT 20H的用法:是从一个程序退出的传统方法。但使用INT 20H时, 必需保证CS含有PSP的段地址。,DOS常驻 部分,PSP,用户 代码段,用户 数据段,ES、DS,CS,用户 堆栈段,DS(DATA),SS(STACK),PSP + 0,FFH CS:0,.EXE文件(不可直接用INT 20H),DOS常驻 部分,PSP,用户程序 CS、DS SS、ES,CS、DS、 SS,100H,64K,初始CS、DS的值,.COM文件

53、(64k,可直接用INT 20H),PSP: DOS装载用户程序时 自动生成,从00H FFH共256字节 其中第一和第二单元放INT 20H,2 .返回DOS的两种不同框架结构的汇编语言程序 INT 20H、INT21H(4CH功能号)都能退出当前程序,返回DOS。但要注意, 他们分别用在不同框架结构的汇编语言程序中。 (1)使用INT 20H指令的源程序框架结构: CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EDAT,SS:STACK START: PROC FAR PUSH DS ;DS入栈 XOR AX ,AX PUSH AX ;0偏移地址入栈 MOV

54、 AX , DATA MOV DS , AX MOV AX ,EDAT MOV ES , AX (程序正文) RET ;将入栈的(DS) CS, 0偏移地址IP,执行INT 20H,返回DOS START ENDP CODE ENDS END START,返回地址入栈, 而它指向程序段的前缀PSP,在PSP入口处放着一条INT 20H指令,(2)使用INT 21H (4CH功能号)指令的源程序框架结构: CODE SEGMENT ASSUME CS:CODE, DS:DATA ,ES:EDAT,SS:STACK MAIN: MOV AX, DATA ;初始化DS MOV DS, AX MOV AX , EDAT ;初始化ES MOV ES , AX MOV AX, STACK ;初始化SS MOV SS ,AX MOV SP ,OFFSET TOP ; (程序正文) MOV AH , 4CH INT 21H CODE ENDS END MAIN,目录,4.6 汇编语言程序设计,4.6.1 程序设计步骤及程序基本结构 1. 程序设计的基本步骤 (1)分析问题,抽象出数学模型 (2)确定算法或解

温馨提示

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

评论

0/150

提交评论