版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 汇编语言程序设计,主要内容:,基本概念,汇编程序的格式和基本语法,伪操作命令和宏指令,DOS和BIOS调用,汇编语言程序设计,程序:为解决某一具体问题或为达到某些目的,将指令和数 据编写成一个相互联系的序列,称之为程序。 机器语言(Machine Language):计算机能直接理解和执行的 语言,是直接采用二进制代码表示的程序设计语言。 汇编语言(Assembly Language):是一种采用助记符表示的 程序设计语言,即用助记符来表示指令的操作码和操 作数,用标号或符号表示地址、常量或变量,是一种 面向机器的语言。,4.1 基本概念,用汇编语言编写的源程序在交付计算机执行前,需要
2、翻译成目标程序,机器方能执行。这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,如下图所示。,汇编程序是最早也是最成熟的一种系统软件。它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还有如下功能:,1. 能够根据用户的要求自动分配存储区域(包括程序区、数 据区和暂存区等); 2. 可以自动地把各种进制数转换成二进制数,把字符转换成 ASCII码,计算表达式的值等; 3. 可以自动对源程序进行检查,给出错误信息(如非法格式 、未定义的助记符、标号、漏掉的操作数等); 4. 允许在源程序中把一个指令序列定义为一条宏指令(即自 定义语句); 5. 具有结构和记录等高级汇编语言功能。,
3、高级语言(High Level Language):如:BASIC语言 、FORTRAN语言、C语言、PASCAL语言等。,4.2 汇编程序的格式和基本语法,示例:编程实现多字节加法,如:S=3B74AC60F8H+20D59E36C1H,CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX ;初始化段寄存器 MOV CX, 5 MOV SI, 0 CLC ;清进位标志 LOOPER:MOV AL, DATA2SI ADC DATA1SI,AL INC SI DEC CX JNZ LOOPER MOV
4、 AH, 4CH ;程序运行结束,返回DOS状态 INT 21H CODE ENDS,END START ;整个源程序汇编结束,DATA SEGMENT ;数据段定义 DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATA ENDS,data segment message db Hello World!,$ data ends code segment assume cs:code,ds:data begin:mov ax,data mov ds,ax mov dx,offset message m
5、ov ah,9 ;待显示的字符串符号(ASCII码),定义DS段且以“$”字符结束, ;把段地址放入DS中,偏移地址放入DX中,利用9号功能键,可以把字符串显示;在屏幕上。 int 21h mov ah,4ch; int 21h code ends end begin,汇编语言源程序采用分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以SEGMENT语句开始,以ENDS语句结束,整个程序的结尾是END语句。在代码段中下面的内容是不可缺少的: (1)定义段(使用SEGMENT/ENDS语句定义) (2)约定段寄存器和段的关系(即明确段与段寄存器的关系,使用一个或多
6、个ASSUME语句实现) (3)装填段寄存器(只装填数据型段寄存器) (4)设置返回DOS的方法,一、汇编语言程序的分段结构,例如: MYDATA SEGMENT; 定义数据段起始语句 ; 定义数据 MYDATA ENDS; 定义数据段终止语句 MYCODE SEGMENT ; 定义代码段起始语句 ASSUME CS:MYCODE,DS:MYDATA;约定段寄存器和段的 ;关系 START: MOV AX,MYDATA; 装填相应的段寄存器 MOV DS,AX ; 完成所需功能的程序段 MOV AH,4CH; 设置返回DOS INT 21H MYCODE ENDS; 定义代码段终止语句 END
7、 START; 程序结束,1.语句分类 指令性语句:也称指令语句,指8086的指令系统,汇编后产生目标代码。 标号 操作码/助记符 操作数 ;注释区 指示性语句:包括伪操作命令和伪操作符,也称伪指令语句,告诉汇编程序如何汇编,汇编后不产生目标代码。 符号名 定义符 参数1,参数2,,参数n ;注释区 宏指令语句:以某个宏指令名定义一段指令序列,在程序中用一条宏指令语句代替一段程序。凡是有宏指令的程序,在汇编时,用相应的目标代码序列代替,插入到对应的程序中,不展开时不产生目标代码。,二、汇编语言语句的类型和格式,2.语句格式 汇编语言是由一条条的语句组成的,语句格式如下: 名字 助记符 操作数
8、;注释 其中带方括号的部分为任选项,可以有,也可以没有。 (1)名字 “名字”是语句的符号地址,对于指令语句,“名字”称为标号,其后必须加冒号“:”;对于伪指令语句,“名字”可以是变量名、段名、过程名等,其后不能加冒号“:”。 “名字”一般都有三个属性:段属性、偏移属性和类型属性。 段属性:表示“名字”所在段的起始地址(即段地址)。 偏移属性:表示“名字”所在段的起始地址到定义该“名字”的地址之间的字节数(即偏移量)。偏移量是一个16位无符号数。,类型属性:表示名字的数据或地址的类型。 对于标号和过程名:类型属性有NEAR和FAR两种,表示只能在段内被引用还是可以在其它段被引用; 对于变量:类
9、型属性有BYTE(字节)、WORD(字)、DWORD(双字)、QWORD(四字)、TBYTE(10个字节)等,表示数据区中所存取的操作数的大小。 对于段名:只有段属性,表示段的起始地址(段地址),没有偏移属性和类型属性。,(2)助记符 指系统提供的有关指令的助记符。在指令语句中,表示该指令语句的操作码,在伪指令语句中称为定义符,它们指出语句的功能。 (3)操作数 操作数即为操作的对象。在指令语句中,可能有单操作数、双操作数,也可能无操作数或隐含操作数;而在伪指令中可能有更多个操作数。当操作数有多个时,要用逗号隔开。 可以作为操作数的有:常量、寄存器、标号、变量和表达式等。 (4)注释 以“;”
10、开始,是对汇编语句的功能或汇编程序的说明。,第三节 汇编语言运算符,汇编语言运算符:是编译程序在编译时计算的,与运算指令不同,指令是在程序运行时计算的。 一、算术运算符 ,*, / , MOD , SHL , SHR MOV AX, A+B 二、逻辑运算符 AND, OR, XOR, NOT C EQU B-A AND AX, C AND OFH,三、关系运算符 EQ、NE、LT、GT、LE、GE运算符分别实现等于、不等于、小于、大于、小于等于、大于等于运算。 由关系运算符连接两个操作数构成关系表达式,其值为逻辑值。当关系表达式成立时,其值为真,关系值为0FFFFH;关系表达式不成立时,其值为
11、假,关系值为0。 示例:MOV AX,PORT LT 5 当PORT5时,汇编成:MOV AX,0 示例:MOV BX,(PORT LT 5) AND 20H) OR (PORT GE 5) AND 30H) 当PORT5时,汇编成:MOV AX,30H,注意: 算术运算符总可以用于数字操作,其结果也是数字的。当应用于存储器操作数时,只有+, -运算符有意义; 逻辑运算符的操作数也必须是数字,存储器操作数不能进行逻辑运算; 关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器地址。,四、值返回符 1) $运算符 $:当前地址偏移量的值,BLOCK DB HELLO! NUM EQU
12、 $-BLOCK,;NUM为 6,STR1 DW AB STR2 DB 16 DUP(?) CNT EQU $-STR1 MOV CX, CNT MOV AX, STR1 HLT,; CX为 18,; AX为4142H,STR1 DW 4142H,STR1 DB 41H, 42H,DATA SEGMENT NA EQU 15 NB EQU 10 NC DB 2 DUP(4, 2 DUP(5, 2) CNT DB $-NC CWT DW $-CNT ND DW NC DATA ENDS,设数据段定义如下:,从DS:0000H开始至CNT单元之前存放的数据依次为:_;ND单元中的值为_;CWT单元
13、中的值为_; CNT单元中的值为_。,4,5,2,5,2,4,5,2,5,2,0000H,1,0AH,SEG 和OFFSET SEG: 求标号或变量的段基址 OFFSET: 求标号或变量的距段首址的偏移量,DATA SEGMENT A DB 12 B DW 23, 25 DATA ENDS MOV BX, OFFSET B MOV AX, SEG B LEA BX, B,; BX: 0001H,; AX: DS值,; BX: 0001H ;与 MOV BX, OFFSET B,DATA SEGMENT TABLE DW 10, 20, 30, 40, 50 ENTRY DW 3 DATA EN
14、DS MOV BX, OFFSET TABLE ADD BX, ENTRY MOV AX, BX,;0000H,;BX: 3,;AX: 1E00H,注意以下两个语句 B DB 5 DUP(2, 3 DUP(0) ; B DW 5 DUP(2, 3 DUP(0) ;,3) TYPE 标号或符号的类型值 对变量 :表示变量的字节数 DB 1, DW 2, DD 4 对标号:表示过程或指令地址的调用类型(NEAR) -1或(FAR) -2,DATA SEGMENT A DB 12 B DW 23, 25 DATA ENDS MOV AX, TYPE A MOV BX, TYPE B,;AX: 000
15、1H,;BX: 0002H,4) LENGTH 和 SIZE,LENGTH: 对DUP情况下, 变量的项数或元素个数, 在其他情况下该项属性为1; SIZE:对操作数分配的字节数。 SIZE=LENGTH TYPE,A DB 1234 B DW 5 DUP(2, 3 DUP(0) ; C DW AB, C, D L1: MOV AL, TYPE B MOV BL, LENGTH B MOV AH, SIZE A MOV BH, SIZE C MOV CL, TYPE L1 MOV CH, SIZE B,; AL: 2,; BL: 5,; AH: 1,; BH: 2,; L1为标号 CL: 0F
16、FH,; CH: 0AH,对于下面的数据定义,各条MOV指令单独执行后,请填充有关寄存器的内容:,TABLE1 DB ? TABLE2 DW 20 DUP(?) TABLE3 DB ABCD MOV AX, TYPE TABLE1 MOV BX, TYPE TABLE2 MOV CX, LENGTH TABLE2 MOV DX, SIZE TABLE2 MOV SI, LENGTH TABLE3,; AX: 1,; BX: 2,; CX: 20,; DX: 40,; SI: 1,5) HIGH 和LOW,HIGH: 对操作数取高字节; LOW: 对操作数取低字节。,NUM EQU 0CDEFH
17、 MOV AH, HIGH NUM MOV AL, LOW NUM,; AH: 0CDH,; AL: 0EFH,五、属性运算符,用来给指令中的操作数指定一个临时的属性,而暂时忽略操作数定义时的属性。,1) PTR 定义操作数为新的类型,新类型 PTR 操作数,操作数可以是存储器的地址或标号名,F1 DW 1234H F2 DB 23H, 56H, 18H MOV AL, BYTE PTR F1 MOV AX, WORD PTR F2,; AL: 34H,; AX: 5623H,DAT1 DB 12H, 34H DAT2 DB 56H, 78H MOV AX, WORD PTR DAT1 ; A
18、X: 3412H CMP AX, WORD PTR DAT2 ; 7856H JA L1 MOV BX, WORD PTR DAT2; BX:5678H MOV WORD PTR DAT2, AX; MOV WORD PTR DAT1, BX L1: HLT,DAT2单元的值是:_,56H,DAT1单元的值是:12H,2) THIS 指定新类型,像PTR一样可用来建立一个特殊类型的存储器地址操作数,而没有为它分配存储器。新的存储器操作数的段和偏移量部分就是下一个能分配的存储单元的段和偏移量。,F1 EQU THIS BYTE F2 DW 4321H, 2255H MOV AL, F1 MOV
19、AX, F2,THIS 类型名,F1,; AL: 21H,; AX: 4321H,F1和F2具有相同的段基地址和偏移地址,但类型不同。,1.算术运算符 、和MOD(取余,即两个整数相除后取余数)、SHR(右移)、SHL(左移)等。 例如:MOV AX,2*0101H MOV AX,STA+2 MOV AL,NUM SHL 1 ;将NUM左移1位再保存结果 2.逻辑运算符 AND、OR、XOR、NOT运算符分别实现逻辑与、或、异或、取反运算。 例如:MOV AL,77H AND 84H ;AL=04H MOV AX,00FFH OR 1783H ;AX=17FFH MOV AH,NOT 0FFH
20、 ;AH=00H,三、汇编语言中的运算符,4.分析运算符 SEG:返回一个变量或标号所在段的段地址 OFFSET:取标号或者变量在段内的偏移地址 TYPE:返回一个变量或者标号的类型属性值,示例:MOV SI,TYPE ARRAY MOV AH,TYPE TABL,变量的类型属性值,标号的类型属性值,5.LENGTH运算符 返回变量或结构的数据区的数据总数,只对DUP定义的变量才有意义,给出分配给变量的基本单位的数目(字节数、字数或双字数),对于未使用DUP定义的变量则返回1。 格式: LENGTH 变量 例如:ARR DW 20 DUP(18H) DAT DB 12,25,AB . MOV
21、AL,LENGTH ARR ;AL-20 MOV AH,LENGTH DAT ;AH-1,6.SIZE运算符 分配字节长度操作符。若使用DUP操作符,则SIZE操作符返回得到分配给该变量数据区的字节总数;若未使用DUP符号,则返回值为TYPE运算的结果。 格式: SIZE 变量 例如: TAB DW 100 DUP(?) TABLL1 DB 12H,34H . MOV AL,SIZE TABLL1 ;AL-1 MOV AH,SIZE TAB ;AH-200 MOV BL,LENGTH TAB ;BL-100 MOV BH,TYEP TAB ;BH-2 结论: SIZE=LENGTH*TYPE,
22、7.PTR运算符 指定建立存储器操作数的类型属性(一个变量或标号) 格式: 类型 PTR 表达式 注意:类型可为:BYTE、WORD、DWORD、NEAR、FAR,表达式可为地址表达式或标号。 例如: MOV AH,BYTE PTR VARWDI JMP DWORD PTR BX;段间间接转移: CALL WORD PTR BXSI;子程序段内调用指令 DATA1 DB 100 DUP(?) ;DATA1为字节类型 DATA2 EQU WORD PTR DATA1 ;DATA2为字型变量 DATA3 EQU DWORD PTR DATA1 ;DATA3为双字型变量,8.THIS指定属性操作符
23、用以指定存储器操作数或地址的类型属性。 格式: THIS 类型 注意: (1)类型可为:BYTE、WORD、DWORD、NEAR、FAR (2)该操作符对应的语句放在DB、DW等伪指令前边(或标号定义的前边),规定一个新变量(或新标号)的属性,其段地址和偏移地址即为紧跟在后面用DB、DW定义(或标号定义)的变量(或标号)的段地址和偏移地址。,(3)一般通过EQU伪指令为符号名赋予THIS指定的类型。 例如: FIRST_BYTE EQU THIS BYTE WORD_TABLE DW 3275H,08ABH 以上定义结果:FIRST_BYTE为字节型变量,WORD_TABLE为字型变量,两者的
24、段地址和偏移地址相同,但类型属性不同。对变量FIRST_BYTE只能字节访问,对WORD_TABLE只能字访问,9.其他操作符及运算符 方括号对通常用以表示存储单元的地址。 “:”段越符放在CS、DS、ES、SS后面,表示段超越。 例如:MOV AL,BX MOV DX,SI+5 MOV AX,ES:SI MOV AL,ES:BX,数据定义伪指令的作用是定义存储变量的类型,给存储器赋初值,或者仅仅给变量分配存储单元,而不赋予特定的值。常用的数据定义伪指令有:DB、DW、DD、DQ、DT等。数据定义伪指令的一般格式为: 变量名 伪指令 操作数1,操作数2,操作数n 方括号中的变量名为任选项,变量
25、名后面不跟冒号。伪指令定义符后面的操作数可以不止一个。如有多个操作数,互相之间应该用逗号分开。,一、数据定义伪指令,3.常量 指在指令中出现的固定值,可分为数值型常量和字符型常量两类。 (1)数值型常量 二进制常量:由0和1组成的序列,后缀为B。 十六进制常量:由0-9和A-F组成的数字序列,后缀为H,凡是以字母打头的常量,必须在字母前面加0,否则会被编译成地址。 十进制常量:即十进制数,后缀为D(可省略)。 八进制常量:即八进制数,后缀为Q。 (2)字符型常量 用单引号括起来的一个或多个字符(字符串)。,4.变量 是存储器中某个数据区的名字,在指令中可以作为存储器操作数。 5.表达式 使用运
26、算符把常数、寄存器、标号、变量等连接起来的运算式。可分为数值表达式和地址表达式两种。,一、常量、变量及标识符,常量:二进制(B),八进制(Q),十六进制(H), 十进制(D)(默认),100 01100100B 244Q 64H,变量:代表存放在某些存储单元的数据,这些数据在程序的运行期间随时可以修改。 在程序中以变量名的形式出现。,定义变量:给变量分配存储单元, 为这个单元起名字(变量名), 可以同时将这些存储单元预置初值。,每个变量都有三个属性,段属性(SEG) 变量所在的存储单元的段基址 偏移量属性(OFFSET) 变量所在的存储单元距段起点的字节数 类型属性(TYPE) 一个单位变量占
27、用存储单元的字节数,分为: DB(1个字节) DW(2个字节) DD(4个字节),DATA SETMENT X DB 5, 4 Y DW 40H Z DD 2030H DATA ENDS,DS:0000H,X,Y,Z,X,Y,Z分别都有三个属性: 段基址,偏移量,类型值 这三个属性都有固定的值。,标识符:给指令或某一存储单元地址所起的名字。 标识符由下列字符组成: 字母: AZ, az; 数字: 09; 特殊字符: ? . _ $,数字不能作标识符的第一个字符,. 必须作标识符的第一个字符,标识符最长为31个字符。,标识符后面跟冒号时,表示标号,代表该行指令的起始地址, 标号可以被转移、调用指
28、令直接引用。 标识符后面不带冒号时,表示变量。,标号:代码段中某一条指令的地址。,标号有3个属性: 段属性(SEG) 该条指令所在段的段基址 偏移量属性(OFFSET) 该指令的偏移地址(距段起点的字节数) 距离属性 表示该标号是作为段内还是段间被调用或转移的,该属性有两个值: NEAR(FFFFH, -1): 本标号只能被标号所在段的转移或调用指令所访问(段内转移),标号后有冒号; FAR (FFFEH, -2): 本标号可被其他段(不是标号所在段)的转移或调用指令访问(段间转移)。,标号名 LABEL FAR,1定义字节命令DB(Define byte) DB定义的变量类型为BYTE,给其
29、后的每个操作数分配1个字节。若操作数是字符串,必须用单引号括起来,每个字符本身用其ASCII码表示。 2定义字命令DW(Define word) DW定义的变量类型为WORD。DW伪指令定义符后面的操作数每个占有1个字,即2个字节。在内存中存放时,低位字节在前,高位字节在后。 3定义双字命令DD(Define double word) DD定义的变量类型为DWORD。DD后面的操作数每个占有2个字,即4个字节。在内存中存放时,低位字在前,高位字在后。,4定义四个字的命令DQ(Define Quadword) DQ定义的变量类型为QWORD,给其后的每个操作数分配4个字,即8个字节。在内存中存放
30、时,低位数据放低地址,高位数据放高地址。 5定义十个字节命令DT(Define Tenbytes) DT定义的变量类型为TBYTE。DT伪指令定义符后面的操作数每个占有10个字节。在内存中存放时,低位字节在前,高位字节在后。 6重复定义伪操作命令DUP 当操作数重复定义多次时,可使用重复定义伪操作符“DUP”表示,其形式为: n DUP(初值,初值) ;n为重复定义的次数,数据定义伪操作后面的操作数可以是常数、表达式或字符串,但每项操作数的值不能超过由伪指令定义符所定义的数据类型限定的范围。字符串必须放在单引号中。 除了常数、表达式和字符串外,问号“?”也可以作为数据定义伪指令的操作数,此时仅
31、给变量保留相应的存储单元,而不赋与变量某个确定的初值。,例: 画图说明下列伪指令所定义的数据在内存中的存放形式。 ARV1 DB 3+4,43H,-2 ARV2 DW 474FH,1,? COUNT EQU 2;EQU定义的是常量,不占用内存单元 ARV3 DB 2 DUP(1,COUNT DUP(2) ARV4 DD ARV3;定义为ARV3 32位的地址,低位字存放的是AVR3的偏移地址,高位字存放的是AVR3的段地址 ARV5 DB AB;此语句等价于 ARV5 DB A,B; 字符串只能用DB,DW伪操作指令定义,若字符串的个数超过两个,只能用DB来定义。字符串必须用括起来,操作数中?
32、号,只能表明预留出一定的存储单元数量,在汇编时不能写入任何数据。 ARV6 DW AB 解:假设此数据段的段地址为1234H,即DS1234H,则有存储器分配图如右边:,符号定义伪指令的用途是给一个符号重新命名,或定义新的类型属性等。符号名包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。 常用的符号定义伪指令有:EQU、(等号)和LABLE 1. EQU 格式如下:符号名 EQU 表达式 EQU伪指令将表达式的值赋予一个符号名,以后可用这个符号名来代替表达式。格式中的表达式可以是一个常量、变量、标号、数值表达式或地址表达式等。例如:,二、符号定义伪指令,CR EQU 0DH ;
33、 常数 LF EQU 0AH A EQU ASCII-TABLE ; 变量 STR EQU 64*1024 ; 数值表达式 ADR EQU ES:BP+DI+5 ; 地址表达式 CBD EQU AAM ; 指令助记符 DAT1 EQU WORD PTR DAT DAT2 EQU DWORD PTR DAT 利用EQU伪指令,可以用一个名字代表一个数值, 或用一个较简短的名字来代替一个较长的名字。 注意:EQU伪指令不允许对同一符号重复定义。,2. (等号) 格式如下:符号名表达式 “”(等号)伪指令的功能与EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义。例如: COUNT1 EQ
34、U 20H COUNT=10 MOV CX, COUNT ;(CX)10 COUNT=COUNT-1 MOV BX, COUNT ;(BX)9 ,3. LABEL LABEL伪指令的用途是定义标号或变量的类型,格式如下: 名字 LABEL 类型 变量的类型可以是BYTE、WORD、DWORD。标号的类型可以是NEAR或FAR。利用LABEL伪指令可以使同一个数据区兼有BYTE和WORD两种属性,这样在以后的程序中可根据不同的需要分别以字节为单位,或以字为单位存取其中的数据。例如:,AREAW LABEL WORD ; 变量AREAW类型为WORD AREAB DB 100 DUP(?) ; 变
35、量AREAB类型为BYTE MOV AREAW, AX ; AX送两个单元中 MOV AREAB49, AL ; AL送一个单元中 LABEL伪指令也可以将一个属性已经定义为NEAR,或者后面跟有冒号的标号(隐含属性为NEAR)再定义为FAR。例如: AGAINF LABEL FAR ; 定义标号AGAINF的属性为FAR AGAIN: PUSH AX ; 标号AHAIN的属性为NEAR 上面的过程既可以用标号AGAIN在本段内被调用,也可以利用标号AGAINF被其他段调用。,一、段定义,一般的源程序分为4个段:代码段Code、数据段Data、堆栈段Stack、附加段Extra。 各个段从段定
36、义语句开始,到段结束语句ENDS结束。,段名 SEGMENT 定位类型 组合类型 类别, 段体 ,段名 ENDS,用户指定,可任选定义,段名必须是合法是标识符。,定位类型:,内存可以看成是一本书,将其分成页,段,字,和字节。 每256个地址为一页(PAGE),每页的起始地址为二进制: * * * 0000 0000 16进制:*00H,第一页 (256个地址),第二页 (256个地址),00000H,000FFH,00100H,00200H,001FFH,每16个地址为一段(PARA),每段的起始地址为二进制: * * * * 0000 16进制:*0H,第一段 (16个地址),第二段 (16
37、个地址),*00H,*0FH,*10H,*1FH,*20H,段(节)是默认的定位类型。,每2个地址为一个字(WORD),每个字的起始地址为偶数; 最基本的类型是字节(BYTE),字节只包含一个地址,可以是内存的任何空间。,定位类型表示所定义的段存放在内存空间时,段首地址对内存空间的要求,即段起始点是放在一页的起点上(PAGE)还是一段的起点上(PARA)等,如果不定义定位类型,编译程序将默认其为段类型,即将段首地址放在从*0H开始的内存空间。,BYTE: 表示本段起始单元可以从任一地址开始; WORD: 表示本段起始单元从一个偶地址开始; PARA: 表示本段起始单元从一个段的边界开始(默认)
38、; PAGE: 表示本段起始单元从一个页的边界开始。,组合类型,组合类型是告诉编译程序,所定义的段与其他段的关系,即将该段存放内存时,是否将该段与其他段在物理上或逻辑上放在一起。 常常一个汇编程序可以有很多代码段、数据段或堆栈段,这时,就要综合考虑各段的组合类型。,NONE: 表示本段与其他段不发生任何关系,该段有自己的基地址,是默认的组合关系。,PUBLIC:在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,共用一个段基址。,COMMON: 表示产生一个覆盖段。连接时,把本段与其他也用COMMON说明的同名段置成相同的起始地址,重叠在一起,共享相同的存储区,其段长度由最
39、长的段确定。,STACK: 在每个汇编程序中,只能必须有一个堆栈段,连接时,将本段与其他也用STACK说明的同名段连接成一个连续的大的STACK段,编译程序自动初始化SS和SP寄存器,使SS的内容为该连续段的首址,SP指向堆栈底部加1的存储单元。,MEMORY: 表示本段在存储器中应定位在所有其他段的最高地址。,AT: 表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接定义段地址,这种方式不适用于代码段。,类别:是用单引号括起来的字符串,连接时,LINK程序把类别相同的段放在连续的存储区中(可以不同名)。类别名可以任意,但一般为CODE , STACK, DATA等,表明该段的
40、类型。,例如:定义堆栈段如下: ST SEGMENT PARA STACK STACK DB 100 DUP(?) ST ENDS,段名,组合类型,类别,定位类型,堆栈长度,段结束,通过定义,自动初始化了SS和SP。,SS:0000H,SS:0063H,SS:0064H,100字节,SP,连接两个汇编语言目标程序时,它们的数据段同名,组合类型为PUBLIC,定位类型为PARA。连接后第一个目标程序的数据段的起始物理地址是01010H,长度为17AH,则第二个目标程序数据段的起始物理地址为多少?,01010H + 17AH= 0118AH,因为第二个数据段的定位类型为PARA,故应从节(段)的边
41、界开始,01190H,因为组合类型为PUBLIC,所以共用一个段基址,在内存中顺序存放。,现有汇编目标程序A和B,它们的数据段类别名相同,组合类型皆为COMMON,若A程序数据段中有字符串ABC,B程序数据段中有字符DEF,则执行连接操作 LINK A+B 后,产生目标程序的数据段中偏移地址为0000H单元的内容是什么?,因为COMMON类型为覆盖,所以组合后B覆盖A,44H,二、过程定义,过程的含义和子程序是一样的,一个码段中可以包含一个或许多过程。,码段名 SEGMENT 过程名1 PROC FAR RET 过程名1 ENDP 过程名2 PROC NEAR RET 过程名2 ENDP 码段
42、名 ENDS,FAR: 该过程为远过程,调用该过程时为段间调用,即CS和IP均要重新赋值; NEAR: 该过程为近过程,调用该过程时为段内调用,只赋值IP。(默认),过程名1 PROC FAR RET 过程名1 ENDP,过程名是合法的标识符; 一个程序的主过程(起始指令所在的过程)应是FAR过程,因为该过程是DOS调用的。过程中应有RET指令,以便返回到调用处。过程可以嵌套调用,但不可以嵌套定义。,过程开始,过程结束,例:延时100ms的子程序,编程如下:,DELAY PROC MOV BL, 10 AGAIN: MOV CX, 2801H WAIT: LOOP WAIT DEC BL JN
43、Z AGAIN RET DELAY ENDP,三、段寻址,虽然定义了段,但由于段名是任意的,编译程序仍然不知道哪个段是码段,哪个段是数据段等,所以在码段中要用ASSUME伪指令进行说明,告诉编译器不同的段寄存器分别对应哪个段地址。,ASSUME 段寄存器: 段名,段寄存器: 段名,,当汇编程序遇到一个段名时,就自动地引用给出的段寄存器对段名加以汇编。,但汇编程序将DS和ES的值赋为PSP首址的值,在程序中还要由MOV指令重新对DS赋值。,正确的DS地址,MOV AX, 数据段名 MOV DS, AX,四、结束语句 END,ENDS : 段结束 ENDP:过程结束 END: 整个汇编源程序结束(
44、不配对使用) 汇编程序在编译时遇到END,便得知源程序已经结束。,END 表达式,表达式为可执行程序运行的起始位置,一般为主过程名。,五、ORG,ORG 表达式,指定了在其后的指令或数据存放的偏移地址。,ORG 0100H MOV AX, 0,表明该指令放在码段,其偏移地址为0100H。码段的首地址从CS:0000H处开始。,六、完整结构,DATA SEGMENT X DB 3 Y DB 5 DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA, SS
45、:STACK BEGIN PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX RET BEGIN ENDP CODE ENDS END BEGIN,将PSP首址压栈,以便返回DOS,设置DS段寄存器内容,源程序结束,第一条指令的地址,分配段寄存器,主过程名,数据段,堆栈段,返回DOS,段定义伪指令的用途是在汇编语言源程序中定义逻辑段,常用的段定义伪指令有SEGMENT/ENDS和ASSUME等。 1. SEGMENT/ENDS伪指令 段名 SEGMENT 定位类型组合类型类别 段名 ENDS 定位类型。定位类型给出一个段在内存
46、中起始的物理地址所具有的特性,即起始边界地址的要求。有:PAGE(页类型)、PARA(节类型)、WORD(字类型)、BYTE(字节类型)四种类型。其中PARA为默认值。,三、段定义伪指令, 组合类型。组合类型在多模块程序设计中表示该段和其它同名段间的组合连接方法。组合类型有PUBLIC、COMMON、AT、MEMORY、STACK等。 类别。类别名是程序员任选的一个字符串,使用时必须用单引号括起来。其作用是在连接时决定各逻辑段的装入顺序。 2. ASSUME伪指令 用来说明段和段寄存器关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段,格式如下: A
47、SSUME 段寄存器:段名,段寄存器:段名, 注意:段寄存器在CS、DS、ES、SS中选择。,3. ORG伪指令 用来指示其后的程序段或数据块存放的起始地址偏移量。格式如下: ORG 数值表达式 例如: ORG 0100H 4.模块定义伪操作NAME/END 用于定义一个汇编语言源程序模块,该程序进行汇编时,汇编到END结束。格式如下: NAME 模块名 模块语句 END 表达式 注意: (1)模块名由程序员命名,以字母开头,最多可有6个字符,可缺省,缺省时以源程序的文件名(.ASM文件)为模块名。 (2)表达式为模块执行时的起始地址(标号表示)。,例如:一个源程序的结构框架如下。 NAME
48、PROG ;模块命名为PROG,可缺省 DATA SEGMENT ;数据段定义 . DATA ENDS STACK SEGMENT ;堆栈段定义 . STACK ENDS CODE SEGMENT ;代码段定义 . START: MOV AX,DATA . CODE ENDS END START ;程序结束,过程定义伪指令用来定义一个过程,即定义一个子程序。格式如下: 过程名 PROC NEAR/FAR RET 过程名 ENDP 其中,PROC伪指令定义一个过程的开始,赋予过程一个名字,并指出该过程的类型属性为NEAR或FAR,如果没有特别指明类型,则认为过程的类型是NEAR;伪指令ENDP标
49、志过程的结束。 上述两个伪指令语句前面的过程名必须一致。,四、过程定义伪指令,当一个程序段被定义为过程后,程序中其他地方就可以用CALL语句调用这个过程。调用一个过程的格式如下: CALL 过程名 过程名实质上是过程入口的符号地址,与标号一样,也有3种属性:段、偏移量和类型。过程的类型属性可以是NEAR或FAR。 一般来说,被定义为过程的程序段中应该有返回语句RET,但不一定是最后一条语句,也可以有不止一条RET语句。执行RET语句后,控制返回到原来调用语句的下一条语句。 过程的定义和调用均可嵌套。例如:,NAME1 PROC FAR CALL NAME2 RET NAME2 PROC NEA
50、R RET NANE2 ENDP NAME1 ENDP 上面过程中,NAME1的定义中包含着另一个过程NAME2的定义。NAME1本身是一个可以被调用的过程,而它也可以调用其他过程。,MY_CODE SEGMENT UP_COUNT PROC NEAR ADD CX,1 RET UP_COUNT ENDP START: . CALL UP_COUNT . CALL UP_COUNT . MY_CODE ENDS END START,SEGA SEGMENT . SUBT PROC FAR . RET SUBT ENDP . CALL FAR PTR SUBT . SEGA ENDS SEGB
51、SEGMENT . CALL FAR PTR SUBT . SEGB ENDS,保护现场: 通常,主程序和过程的设计是分开的,因而它们所使用的寄存器往往会发生冲突。为避免冲突,应在进入过程时,将该过程所用到的寄存器内容保护起来,称为保护现场。 恢复现场: 从过程返回主程序前,将原先保护起来的寄存器的内容恢复,称为恢复现场。 保护现场和恢复现场通常分别用堆栈压入指令和弹出指令来实现。如下所示:,SUBPR PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX RET SUBPR ENDP,PUSH AX PUSH
52、 BX PUSH CX PUSH DX CALL SUBP POP DX POP CX POP BX POP AX,一个子程序调用另一个子程序称为子程序的嵌套调用。由于调用子程序时,断点地址保存在堆栈中,因此只要有足够的堆栈空间,嵌套的层次(也称深度)是不受限制的。如下图所示:,五、宏指令及其使用,宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义为一个宏指令,每次需要时,即可简单地用宏指令名来进行宏调用,从而避免了重复书写,使源程序更加简洁、易读。 宏定义由MASM宏汇编程序提供的伪指令实现。,1.宏定义 宏指令名 MACR
53、O 形式参数 ENDM 2. 宏调用 宏指令名 实际参数 只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。 3. 宏展开, ,宏体,具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。 宏展开实际上是用宏定义时设计的宏体去代替相应的宏指令,并用实际参数一一取代形式参数。 由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由MASM进行宏展开。,例 若源程序中多处需要将AL和CL寄存器中的两位压缩型的BCD数相加,并将和送回CL寄存器,则可以定义宏指令,然后在需要的地方进行调用。 DECADD MACRO ADD AL,CL DAA MOV CL
54、,AL ENDM 显而易见,这是一个没有形式参数的宏定义。,如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为 DECADD1 MACRO OPR1,OPR2 ;带参数的宏定义 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 这是一个带有两个形式参数的宏定义。宏指令为 DECADD1。宏调用如下:,DECADD1 DL, BUFFER DECADD1 AREA1, AREA2 在汇编时进行宏展开,得到以下指令: DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFF
55、ER + DAA + MOV DL, AL DECADD1 AREA1, AREA2 + MOV AL, AREA1 + ADD AL, AREA2 + DAA + MOV AREA1, AL,4.宏指令与子程序(过程) 在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。它们都是可被程序多次调用的程序段,并且调用前必须由设计者根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和其格式不同,因此,使用中有许多不同之处,主要是空间和时间的差异。,子程序由CALL指令调用,由RET指令返回,汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏
56、调用处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。,从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令优于子程序。 综上所述,当某一个需要多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较短,访问次数又很频繁时,选用宏指令结构要更好些。,DSEG SEGMENT STRING1 DB 1,2,3,4,5 DSEG ENDS ESEG SEGMENT STRING2
57、DB 5 DUP(?) ESEG ENDS SSEG SEGMENT STACK STACK DW 10 DUP(?) TOP LABEL WORD SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME ES:ESEG,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX,MOV SP,OFFSET TOP LEA SI,STRING1 LEA DI,STRING2 MOV CX,5 CLD REP MOVSB MOV AH,4CH INT 21H CSEG ENDS END START,第五节 DOS功能调用,操作系统管理计算机,为用户提供与CPU对话的接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 30104.205-2013数字可寻址照明接口 第205部分:控制装置的特殊要求 白炽灯电源电压控制器(设备类型4)》
- 2026年初高中语文试题及答案
- 义务教育经费管理使用情况专项审计问题整改报告
- 深度解析(2026)《GBT 29745-2013公共停车场(库)信息联网通 用技术要求》
- 深度解析(2026)《GBT 29831.3-2013系统与软件功能性 第3部分:测试方法》
- 深度解析(2026)《GBT 29784.4-2013电子电气产品中多环芳烃的测定 第4部分:气相色谱法》
- DB3709-T 009-2022 废弃鱼塘垦造藕田建设规范
- 《GBT 219-2008煤灰熔融性的测定方法》(2026年)合规红线与避坑实操手册
- 《DL/T 1384-2023电力行业供应商信用评价指标体系分类及代码》(2026年)合规红线与避坑实操手册
- 2026年社区老年日间照料服务协议
- 2026重庆市荣昌区人力资源和社会保障局招聘1人笔试备考题库及答案详解
- 2026年城市协管员招聘综合知识(城管知识)题库及答案
- 肺穿刺应急预案(3篇)
- 2026年第七师检察分院公开招聘书记员备考题库参考答案详解
- 2026年中国化工经济技术发展中心招聘备考题库及一套答案详解
- 雨课堂学堂在线学堂云《运动训练基本原理与方法(北京体育大学 )》单元测试考核答案
- 雨课堂学堂在线学堂云《储层表征与建模(中石)》单元测试考核答案
- 洁净管道管路施工技术交底
- 湖南集体备课大赛课件
- 企业重大项目管理办法
- MOOC 创业基础-暨南大学 中国大学慕课答案
评论
0/150
提交评论