《第3章 汇编语言及编程wy-001》由会员分享,可在线阅读,更多相关《第3章 汇编语言及编程wy-001(97页珍藏版)》请在金锄头文库上搜索。
1、第三章 汇编语言及编程2010 .10.20.,3.1 汇编语言程序结构与汇编语句,3.1.1 汇编语言源程序结构 3.1.2 汇编语言的语句,3.1.1 汇编语言源程序结构,80X86/Pentium系列MPU汇编语言都是以逻辑段为基础,按段的概念来组织代码和数据的。因此,源程序结构与逻辑段的定义方法密切相关,而宏汇编语言MASM 5.0以上的版本中,逻辑段既可用完整段定义,又可用简化段定义。,1. 标准的单模块源程序框架,.586DATA SEGMENT USE16/USE32;定义数据段 ;数据定义伪指令序列DATA ENDSSTACK SEGMENT USE16/USE32 STACK
2、;定义堆栈段 ;数据定义伪指令序列STACK ENDSCODE SEGMENT USE16/USE32;定义代码段 ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATASTART: MOV AX,DATA;取数据段基址 MOV DS,AX;建立DS的可寻址性 MOV ES,AX ;建立ES段的可寻址性 ;核心程序段 MOV AH,4CH;返回DOS操作系统 INT 21HCODE ENDS END START, 一个源程序由若干逻辑段组成。一般一个源程序具有数据段、附加数据段、堆栈段和代码段;但只有代码段是必不可少的。,(1) 使用DOS的4CH号功能调用这种方法是在
3、代码段结束前加调用语句: MOV AH,4CH ;功能号4CHAH INT 21H ;中断调用,(2) 使用20H号软功能调用调用方式是在代码段结束前加调用语句: INT 20H,(3) 使用DOS的0号功能调用调用方式是在代码段结束前加调用语句: MOV AH,0 INT 21H,2.返回DOS状态的方法,(4) 将主程序定义为远过程,也称为“标准序”方法。这种方法是在代码段开始处按下述方式定义主程序:CODE SEGMENT ASSUME 主过程名PROC FARPUSH DS SUB AX,AX ;标准序 PUSH AX RET主过程名 ENDPEND 主过程名,指令语句伪指令语句宏指令
4、语句,3.1.2 汇编语言的语句,语句是汇编语言程序的基本组成单位,用于规定汇编语言的一个基本操作。 汇编语言包含三种基本语句:,是可执行语句,由硬件(CPU)完成其功能,汇编时产生目标代码 。,不可执行语句,其功能由相应软件完成,不产生目标代码。,用户定义的新指令,汇编时产生相应的目标代码。,1.标号和名字 分别是给指令单元和伪指令起的符号名称,统称为标识符。 标识符:,指令语句 : 标号: 助记符 操作数 ;注释伪指令语句 : 名字 定义符 操作数 ;注释,3.1.2 汇编语言的语句格式,2. 助记符和定义符分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,统称操作符。3. 操作数操
5、作数允许有多个,这时各操作数之间要用逗号“,”隔开。,操作数 =,常量寄存器存储器表达式(地址、数据),数据,3.1.3. 汇编语言的数据,常数 常数是指那些在汇编过程中已有确定数值的量,分为数值常数和字符串常数两类。 常数是没有任何属性的纯数值。 主要用作:,指令语句中的立即操作数基址、变址或基址加变址寻址中的位移量伪指令语句中用于给变量赋初值,标号是指令的符号化地址,一定在代码段; 变量是数据的符号化地址,一般在数据段,有时也可在代码段定义。,1)变量与标号有三个共同属性:,段基址:所在段的起始地址(SEG)偏移值:相对于段基址的位移量(OFFSET)类型 :所占字节数(TYPE) - 变
6、量 远近调用NEAR ,FAR - 标号,2. 变量与标号,2)变量与标号区别,标号可以用作转移控制类指令的操作数,但变量不能。变量可以用作基址、变址或基址加变址寻址的位移量, 但标号不能。,例 假设VAR1和VAR2为字变量,LAB为程序中的一个标号,判断下列指令是否正确,若错误请指出错误之处:, ADD VAR1,VAR2 SUB AL,VAR1 JNZ VAR1 JMP LABSI JMP NEAR LAB MOV AX,VAR1BX JMP VAR2BX,错,不允许存储器变量间直接传数,错,源与目的操作数类型不一致,错,变量不能用作条件转移指令的操作数,错,标号不能用作变址寻址的位移量
7、,错,缺PTR运算符,正确,正确,指在汇编过程中能够由汇编程序计算出数值的表达式。 可作为指令中的立即操作数和数据区中的初值使。例如: MOV BX,0FFF0H AND 0B234H MOV AL,4CH EQ 2 MOV AH,4CH GT 1 MOV AX, SEG LABLE,1.数值表达式,3.1.4. 表达式,其值表示存储器地址,一般都是段内的偏移地址。 与变量一样,地址表达式也具有段值、偏移值和类型属性。 地址表达式主要用来表示指令语句中的操作数,例如: MOV AX,BASEEAXEBX JMP BASEEAX LEA BX,BASE+12,2.地址表达式,表达式是汇编语句操作
8、数的基本形式,由运算符和运算对象组成。,K1 DB 4 DUP(0)K2 DW 10 DUP(?)K3 DD 1, 2, 3 MOV AL, LENGTH K1 MOV BL, LENGTH K2 MOV CL, LENGTH K3,MOV AL, 4 MOV BL, 10 MOV CL, 1,MOV AH, TYPE K1MOV BH, TYPE K2MOV CH, TYPE K3,MOV AH, 1MOV BH, 2MOV CH, 4,MOV BX, SIZE K1MOV SI, SIZE K2MOV DI, SIZE K3,MOV BX, 4MOV SI, 20MOV DI, 4,只有当
9、定义语句中使用DUP的情况下,SIZE运算符返回的数值才真正代表该变量所占据的总字节单元数。,3.2.1 程序结构伪指令语句,方式选择伪指令完整段定义伪指令指定地址伪指令模块定义伪指令,这类语句是与程序结构紧密相关的基本伪指令语句,用于说明CPU的类型、逻辑段结构、源程序(或模块)起止信息和段内存的安排等。主要包括:,3.2 伪指令语句,3.2.1 方式选择伪指令,方式选择伪指令用于通知汇编程序,当前的源程序指令是哪一种CPU指令,经过汇编链接之后生成的目标程序在哪一种CPU机型上运行。不属于选定CPU的指令均为非法指令。所以,方式选择伪指令本质上也就是指令集选择伪指令。 通常,方式选择伪指令
10、放在程序的头部,作为源程序的第一条语句。缺省时默认8086指令集。,3.2.2. 完整段定义伪指令,采用完整段定义伪指令可具体控制汇编程序(MASM)和链接程序(LINK)在内存中组织代码和数据的方式。 主要包括段定义语句和段寄存器说明语句。,1. 段定义语句, 格式:段名 SEGMENT 定位类型,组合类型,字长选择,类别 段体 ;由指令、伪指令和宏指令语句组成段名 ENDS, 说明: (1) SEGMENT/ENDS是一对段定义语句,一个逻辑段从SEGMENT语句开始,到ENDS语句结束。,(2) 段名是用户定义的段的标识符,用于指明段的基址。,(3) 4个可选参数用于为源程序的汇编、连接
11、提供必要的信息,特别是模块化程序,各个模块如何定位,彼此之间如何连接,将较多地涉及到定位类型和组合类型的选择。,2. 段寄存器说明语句,格式: ASSUME 段寄存器:段名,段寄存器:段名,,功能: 说明源程序中定义的段由那个段寄存器去寻址。,说明: CS只能用于包含有程序的段,反之含有程序的段也只能以CS作为段寄存器。SS也一样,只能与堆栈段对应。, CS所对应的段名必须在该语句之前有定义。, 该语句是说明性语句。,3.2.3 数据伪指令语句,格式:,赋值语句:符号名 EQU 表达式,功能: 都是用符号名代替表达式的值。但赋值语句定义的符号名不能重新定义,而等号语句允许。,1. 符号常数定义
12、伪指令,等号语句:符号名 = 表达式,等号语句在汇编时不产生任何目标代码,也不占用存储单元。但在同一个程序中,不能对经EQU语句定义的符号重新定义。EQU伪指令的使用可使汇编语言程序简单明了,便于程序调试和修改。 符号常数可以在任何逻辑段定义,汇编后是立即数。,例 赋值语句与等号语句举例。赋值语句:X EQU 50Y EQU X +10COUNT EQU $ - ARRY 等号语句:CON = 5BASE = 200H BASE = BASE + 10H;重新定义BASE,2. 数据定义伪指令,功能: 是为数据项或项表分配存储空间,给它们赋初值,并用一个符号名(称为变量)与之相联系。,MOV
13、AX , TABLE ; TABLE 可以是由“=” , 也可以是“DW”定义 ; 分别代表立即数,和地址,(1)用数值表达式定义变量【例】 K1 DB 10, 4, 10H K2 DW 100, 100H, -5 K3 DD 3*20, 0FFFDH,【例】 RS1 DW ADDR1 DW ADDR2 RS2 DD LOOP1 DD LOOP2汇编程序在汇编时,在相应存储区域中存入有关变量或标号的地址值. 其中偏移地址或段基址均占一个字。低位字节占用第一个字节地址,高位字节占用第二个字节地址。 若用DD定义变量或标号,则偏移地址占用低位字,段基址占用高位字。,(2)用地址表达式定义变量,STRING1 DB 123STRING2 DB HOW ARE YOU? STRING3 DW C , DE,OPER1 DB 35H, ?, 0AH OPER2 DW 0C0DH, ? OPER3 DD ?,(3)字符串定义的变量,【例】 OPER1 DB 35H, ?, 0AH OPER2 DW 0C0DH, ? OPER3 DD ?,(4)用问号(?)定义不确定值的变量 可为变量保留空单元, 常用来存放运算的结果。,