590 likes | 804 Views
第四章 宏汇编语言程序设计. 程序设计语言概述 用于程序设计的语言分为 : 1 、 机器语言 : 用二进制表示的程序,能被机器直接识别 。 2 、 高级语言 : v b 、vc++、C#、java 等语言 。 3 、 汇编语言 : 用指令的助记符、符号地址、标号等编写成 ,面向机器的语言,8086使用的是 MASM6.X版本。. 汇编语言源程序的框架结构 例 4.1 打印输出字符串“ THIS IS A SAMPLE PROGRAM.”; DATA SEGMENT ;数据段
E N D
第四章宏汇编语言程序设计 程序设计语言概述 用于程序设计的语言分为: 1、机器语言:用二进制表示的程序,能被机器直接识别。 2、高级语言:vb、vc++、C#、java等语言。 3、汇编语言:用指令的助记符、符号地址、标号等编写成,面向机器的语言,8086使用的是 MASM6.X版本。
汇编语言源程序的框架结构 例4.1打印输出字符串“THIS IS A SAMPLE PROGRAM.”; DATA SEGMENT ;数据段 DA1 DB‘THIS IS A SAMPLE PROGRAM’ DB 0DH,0AH,’$’ DATA ENDS STACK SEGMENT STACK‘STACK’ ST1 DB100 DUP(?) STACK ENDS CODE SEGMNET ;代码段 MAIN PROC FAR ASSUMECS:CODE,DS:DATA,SS:STACK
START: MOV AX,STACK;送堆栈段地址 MOV SS,AX PUSH DS;为程序执行完毕返回DOS做准备 MOV AX,0 PUSH AX MOV AX,DATA;送数据段地址 MOV DS,AX MOV AH,9;DOS9号功能调用,显示字符串 MOV DX,OFFSET DA1 INT 21H RET MAIN ENDP CODE ENDS END START
一个完整的汇编程序应该包含以下几个部分: 1.段定义(代码段、数据段、堆栈段) 段名 SEGMENT ...... 段名 ENDS 2.段分配 ASSUME CS:段名,DS:段名, SS:段名,ES:段名 3.设置段地址(代码段由机器分配) MOV AX,STACK;送堆栈段地址 MOV SS,AX MOV AX,DATA ;送数据段地址 MOV DS,AX
4.返回DOS语句及程序结束 (1)在程序开始部分的堆栈段设置后面写: • PUSH DS; • MOV AX,0 • PUSH AX • 将DS的内容及0作为段地址和偏移地址入栈,在程序结束时返回DOS. (2)在程序结束前使用DOS功能调用指令: MOV AX,4C00H INT 21H
5.过程调用(需要时) • 过程名 PROC FAR(NEAR) • ...... • 过程名 ENDP • 6.结尾语句 • END • 或 END START
源程序的结构和特点 1、由若干逻辑段组成,各段都有一个段名,由段 定义语句来进行定义和说明。 2、在代码段的起始处,用ASSUME命令来说明各个 段寄存器与逻辑段的关系。 3、每个逻辑段由若干行汇编语句组成,每行只有 一条语句,且不超过128个字符,整个源程序用 END结束。 4、每一条语句由最多由4个字段组成,每个字段 用空格分开。 5、每个源程序在代码段中都必须有返回DOS 操作系统的指令语句,保证程序执行完毕 可以返回DOS系统。
4.1 汇编语言程序格式 4.1.1指令性语句和伪指令语句 1、指令性语句->机器指令 标号:指令助记符 操作数,操作数;注释 例:mov ax,00h;把00送到ax中 2、伪指令语句->无机器指令 完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。
伪指令语句语句格式: 名字 伪指令指示符操作数,操作数;注释 名字是给伪指令取的名称,用符号地址表示,后面不带冒号,名字可以省略。 名字通常是:变量名,段名,过程名,符号名等。 例:MESSAGE DB ‘THIS IS A SAMPLE ROGRAM’ DB 0DH,0AH,’$’ DATA SEGMENT DATA ENDS ASSUME CS:CODE DS:DATA 都属于伪指令语句
4.1.2数据项 操作数可以是常数,寄存器,存储器,变量,标号或表达式。 1、常数:固定值,没有属性,是确定的数据。 例: 1101B,0F0H,100D,,2370Q,0A7F2H,‘ABC’。 2、变量:指存放在存储单元中的值,在程序运行中是可以修改的。变量具有三个属性。 (1)段值(段基址)(2)段内偏移地址(3)类型(字节) 3、标号:可执行指令语句的地址的符号表示,可作为转移指令的目标操作数。 标号亦具有三个属性: (1)段值(2)段内偏移地址(3)类型(距离)
4.1.3MASM中的表达式 表达式由运算对象符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数去使用。 MASM中使用了6类运算符(表4.1P128)。 1、算术运算符(整数) 包括:+,-,*,/,MOD,SHL,SHR7种。 例4.2:ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV AX,30*5 MOV CX,(TRY-ARRAY);长度 汇编时,得到: MOV AX,150 MOV CX,8
2、逻辑运算符 包括:AND,OR,NOT,XOR4种。 (对常数按位运算,结果也为常数) MOV AL, NOT 0FFH MOV BL, 8CH AND 73H MOV AH,8CH OR 73H MOV CH, 8CH XOR 73H 汇编时,得到: MOV AL, 0 MOV BL, 0 MOV AH, 0FFH MOV CH, 0FFH
3、关系运算符 包括6种:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)。 关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。结果是一个数值,若结果为真,输出全1,0FFH或0FFFFH。若结果为假,输出全0. 例4.5 MOV AX, 10H GT 16 ADD BL, 6 EQ 0110B MOV CX,((PORT LT5)AND 100)OR((PORT GE5)AND 200) 汇编时形成指令: MOV AX,0 ADD BL,0ffh MOV CX,100
4、数值返回运算符 加在变量或标号前,返回运算对象的某个参数值。 1)OFFSET 变量或标号 返回变量或标号的偏移地址值 例:MOV BX,OFFSET DA1 该指令相当于指令:LEA BX,DA1 2)SEG 变量或标号 取变量或标号的段基值。 例:MOV AX, SEG M1 MOV DS,AX
3)TYPE 变量或标号 TYPE加在变量前,返回变量的类型属性,加在标号前,返回标号的距离属性。(见表4-2,p131) 例:A1 DB 20H, 30H A2 DW 0438H A3 DD ? L1:MOV AH,TYPE A1; AH=1 MOV BH,TYPE A2; BH=2 ADD AL, TYPE A3; AL=4 MOV BL,TYPE L1; BL=0FFH
4)LENGTH 变量 当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其它变量则返回1。 例:M1 DW 100 DUP(?) M2 DW 1,2,3 M3 DB 'ABCD' MOV CX,LENGTH M1; CX=100 MOV BL,LENGTH M2; BL=1 MOV AL,LENGTH M3; AL=1
5)SIZE 变量 • 加在变量前,返回该变量包含的总字节数。SIZE=LENGTH*TYPE • 例 MOV CX,SIZE M1 • MOV BL,SIZE M2 • 得到:MOV CX,200 • MOV BL,2
5.修改属性运算符 综合运算符。通过它可以修改变量或标号的属性,包括段属性,偏移地址属性,类型属性等。 1)段操作符 格式:段前缀:变量或地址表达式 (CS,DS,ES,SS后跟冒号“:”,表示某个变量或地址被修改到段寄存器提供的段基址中) 例 MOV AX,ES:[BX];段超越到ES段
2)PTR 格式:类型/距离 PTR 变量或标号 功能:将PTR左边的类型属性赋给右边的变量或标号(常与类型 BYTE,WORD,NEAR,FAR等连用)。 例4.12 N1 DB 15H,36H N2DW 1122H,3344H LO:MOVAX,WORD PTR N1; (使N1类型转换成字与AX类型匹配) MOV BL, BYTE PTR N2; (使N2类型转换成字与BL类型匹配) • 也可用PTR来改变距离属性: • JM FAR PTR LO
3、THIS 格式:变量/标号 EQU THIS 类型/距离 功能:将EQU THIS右边的类型/距离属性,赋给左边的变量/标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。 例 4.13 FIRST EQU THIS BYTE TABLE DW 200 DUP(?) 4、SHORT 格式:SHORT 标号 用来说明转移类指令中转向地址的属性,即目标地址与本指令之间的距离在-128~+127之间短转移。 例 4.15LI: JMP SHORT L2 …… L2: MOV AX,0
5、HIGH和LOW 格式:HIGH/LOW 变量/标号 字节分离运算符,对一个数或地址表达式,HIGH从中分离出高位字节,LOW分离出低位字节。 例 4.16K1 EQU 0ABCDH K2 EQU 1234H MOV AH,HIGH K1 MOV BL,LOW K2 六、其它运算符 1、圆括号() 用来改变运算符的优先级别,( )中的运算符具有最高优先权。 2、方括号[ ] 用来表示地址表达式或多重变量的下标值。
例 :MOV AL,M1[3] MOV CX,M2[0] MOV M3[1],CX 3、尖括号< >, 及圆点 . 在结构中专用。 4、MASK和WIDTH 运算符,在记录中专用。 WIDTH:指定记录或字段的位的长度。 MASK:字段名,8/16位二进数 七、优先级 表4.3 P134
4.2 伪指令语句 完成变量定义,存储器分配,指示程序开始和结束,段定义,段分配等 *数据定义语句:DB,DW,DD *标号赋值语句:EQU,= *段定义语句: SEGMENT … ENDS *段分配语句: ASSUME *过程定义语句:PROC … ENDP *程序开始结束语句:ORG, END
其它伪指令(不常用): • 群定义语句:GROUP • 结构定义语句:STRUC...ENDS • 记录定义语句:RECODE
4.2.1 数据定义语句 格式1:变量名 助记符 操作数,操作数...;注释 格式2:变量名 助记符 n DUP(操作数,操作数...) 功能:将操作数存入变量名指定的存储单元,或者只分 配存储空间不存入数据。 变量名—用符号表示,可以省略。 助记符:DB(字节) DW(字) DD(双字) DQ(四个字) DT(十个字) 操作数—可以是常数、字符串、变量、标号、 表达式等, 多操作数之间必须用逗号隔开。
用nDUP()表示时,n必须是正整数,表示括号 中的操作数的重复次数。 例4.19 图4.1 DA1 DB 10H,52H;变量DA1中装入10H,52H DA2 DW 1122H,34H DA3 DD 5*20H,0FFEEH 例4.20 图4.2 FIRST DB ‘HELLO’;ASC码转入FIRST首址 SECONDDW ‘OK’ 例 操作数用?定义不确定值的变量,用作保留存储空间 M1 DB ?;M1为不确定量,保留1个字节空间 M2 DW0D55H,?;M2第二个字为不确定量,保留二个字节空间
DA1 10 10H (DB) 52 52H DA2 22 1122HFIRST 48 "HELLO" (DW) 11 45 34 34H4C 00 4C DA3 A0 5*20H4F (DD) 00 SECOND 4B "OK" 00 4F 00 EE图4.2 FF 00 00 图4.1
例 ONE DB 5 DUP(0);重复5个零->ONE TWO DW 10 DUP(?);保留10个字 4.2.2 表达式赋值语句(不占内存) 1.赋值语句 EQU 格式: 符号名 EQU 表达式 功能: 用来给变量,标号,常数,指令,表达式等定义一个符号名,程序中用到EQU左边的变量、标号时可用右边的常数值或表达式代替,但不能重复定义.
COUNT EQU 100 DATA EQU COUNT+2 A1 EQU [BX+SI] BI EQU OFFSET A1 2.等号语句 = 功能同EQU,但用“=”定义的语句允许重复定义。 COUNT=100 COUNT=COUNT+10
4.2.3 段定义语句 1.段定义语句 SEGMENT… … ENDS 格式;段名 SEGMENT 定位类型 组合类型‘分类名’ ……;逻辑段内容 段名 ENDS 功能:将一个逻辑段定义成一个整体。 段名:是逻辑段的标识符,不可省略。上下段名必须一致。 (1)定位类型 该参数是对段起始地址定位。 PARA:段起始地址在节的整数边界,缺省时默认为PARA。 BYTE:段起始地址定位在任何字节地址。 WORD:段起始地址定位在字的边界,即首地址为偶数。 PAGE:段起始地址定位在页的边界,首址为256的整数倍。
(2)组合类型 各个逻辑段之间的组合方式,各段独立,各段覆盖或顺序组合等。 NONE:各同名段互相独立,缺省参数。 PUBLIC:该段与其它同名段连接,组成一个逻辑段。 COMMON:定位该段与其它同名段有相同的首地址,采用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。 AT:定位该段的起始地址在表达式所指定的节边界上。 STACK:指定该段为堆栈段,多个模块只需设置一个堆栈段。 MEMORY:第一个逻辑段覆盖在其它同名段的最上层,其它带此参数的同名段按照COMMON方式处理。 (3)‘分类名’ 汇编程序连接时将所有分类名相同的逻辑段组成一个段组。 段定义语句允许嵌套设置,但不允许各个逻辑段相互交叉设置。
2.段分配语句(ASSUME) 8086/8088允许用户设置多个逻辑段,但只允许4个逻辑 段同时有效(称为当前的逻辑段),ASSUME用来完成将逻辑段分别定义成CS段,DS段,ES段,SS段。 格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名 功能:定义四个逻辑段,指明段和段寄存器的关系。 ASSUME放在代码段的开始,不可省略。 例4.27 p140 SSTACK SEGMENTSTACK ‘STACK’;SS段定义 DB 100 DUP(?) SSTACK ENDS 可省略 DATA1 SEGMENT ;DS段 D1 DW 0ABCDH D2 DW 1234H DATA1 ENDS
DATA2 SEGMENT ;ES段 RESULT DW ? DATA2 ENDS CODE SEGMEN ;CS段 ASSUME CS:CODE,DS:DATA1 & ES:DATA2,SS:SSTACK MAIN: MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AX,D1 SUB AX,D2 MOV RESULT,AX CODE ENDS END MAIN
4.2.4 过程定义语句 格式: 过程名 PROC 属性 ;过程内容 RET N 过程名 ENDP 功能:定义一个过程,主程序可以用CALL指令调用它 过程名:不可缺省,它是主程序中CALL指令的目标操作数 属性:为NEAR或FAR。 过程调用允许嵌套和递归调用。
例4.30 P143过程嵌套调用格式 • MSUBPROC FAR • ... • CALL SBU1 • ... • RET • SUB1 PROC NEAR • ... • RET • SUB1 ENDP • MSUB ENDP
4.2.5程序开始和结束语句 1.NAME 格式:NAME 程序名 功能:为源程序目标模块赋名字,放在程序开始。 2.ORG 格式:ORG 表达式 功能:给汇编程序设置指针,指定下面语句的起始偏移地址。 例4.32 用ORG 改变数据段地址。 DATA SEGMENT ORG 100H A1 DB 10H,20H,30H;A1偏移地址为100H ORG 200H A2 DW 3031H,3233H;A2偏移地址为200H DATA ENDS 3.END 格式:END 标号名 功能:标记汇编源程序结束。放在源程序的最后一行。
4.2.6 结构定义语句 • 1.结构定义 • 格式:结构名 STRUC • 数据变量 • 结构名 ENDS • 不允许超前使用。 • 数据变量类型: • (1)简单变量:一个元素 • (2)多重变量:多个元素 • (3)字符串变量:字符串 • (4)多重结构:包含另一个结构。
例4.33 定义一个数据表格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(<元素值,元素值 ...>);注释 • N表示需要预置相同的结构副本的个数。 • 例4.35 对例4.33结构预置4个结构副本。 • ONE TAB<> • TWO TAB<'STOP'> • THREE TAB<,OFH,SEG L2> • FOUR TAB 5 DUP(<'EFGH',55H>) • 各个变量用“.”与变量名联系表示。 • 如:TWO.T1 PAGE 146图4.5
3.结构的使用 例4.36 要求将AX寄存器内容写入结构副本TWO的变量T2中。 MOVE TWO.T2, AX 例4.37 将变量FOUR.T5[0]的值取出 送到BX寄存器。 MOV BX,FOR.T5[0]
例4.38 定义描述学生情况的结构 • 预置10个学生的结构副本,并比较其中两个同学的 学习成绩。 • 定义结构STUDENT: • STUDENG STRUC • NUMBER DD 0206078 • NAME DB 'xxxxxx' • SEX DB '女';字符串变量 • AGE DB 20 • SPECIA DB '通信' • POLITI DB '团员' • CREDIT DW 100 • STUDENT ENDS
预置STUDENT的结构副本 • STUDENT0 STUDENT <0206070,'陆红梅','女’,20,'通信’,'团员’,95> • STUDENT1 STUDENT <0206071,'王 强','男’,21,'计算机’,'团员’,96> • .... • STUDENT8 STUDENT <0206078,'张 红','女’,19,'通信’,'团员’,90> • STUDENT9 STUDENT <0206079,'钱伟国','男’,19,'电子’,'团员’,92> • 比较王强与张红两位同学的成绩: • MOV AX,STUDENT1.CREDIT • CMP AX,STUDENT8.CREDIT
4.2.7 外部伪指令及对准伪指令 • 1.外部伪指令 • PUBLIC 名称,名称,...;注释 • (定义共享模块) • EXTRN 名称:类型,名称,类型,...;注释 • (调用共享模块) • 名称是下列种类,则类型对应: • 名称 类型 • 变量 BYTE/WORD • 标号 NEAR/FAR • 常数 ABS • 例4.39 page149
2.对准伪指令 格式:EVEN 功能:使下条语句的地址调整为偶地址。 例4.40 3.LABEL 格式:名称 LABEL 类型属性 功能:给已定义的变量或标号取另一个名字, 并可重新定义它的类型属性,使同一变量或 标号在不同地方被引用时,可采用不同的名 字,具有不同的类型属性,提高了程序的灵 活性。
1)LABEL 与变量联用 • 与变量联用时,给下一个变量起一个别名,类型属性可修改为BYTE,WORD等。 • 例4.42 • DATB LABEL BYTE;DATB为DATW的别名,类型为字节 • DATW DW 3031H,3233H • MOV AL,DATB[0];AL<-31H • MOV BX,DATW[1];BX<-3330H
例4.44 • DISF LABEL FAR • DISN: MOV AX,[SI] • DISF与DISN指向同一条指令,DISF是DISN的别名。 • 但距离属性改为FAR,当其它代码对它调用时, • 可以使用。
4.3 DOS系统功能调用和BIOS中断调用 DOS系统功能内部命令:DIR,TYPE,CD调用 及对I/O设备的管理功能。BIOS中断调用是 为了方便汇编语言程序设计而提供的一些例行子程序. p154 表4.6 DOS常用的软中断命令 4.3.1 常用的软件中断 1.读/写磁盘扇区(INT 25H/INT 26H) 2.退出程序(INT 20H) ROM BIOS是常驻内存(ROM)中的部分设备驱动程序. 访问BIOS是通过软中断指令进行的,当用户要调用BIOS中断子程序时,只要安排一条相应中断类型号 n 的软中断指令. INT n即可。
DOS系统功能调用 实现设备管理,文件读/写,文件管理和目录管理等功能. 设备管理:键盘输入、显示输出、设置磁盘缓冲区、选 择当前盘等功能调用 目录管理:查找目录项、更改目录项、建立子目录等 文件管理:打开文件、建立文件、读写文件、删除文件等 调用格式: (1) 系统功能号送到AH寄存器 (2) 入口参数送到指定寄存器 (3) 用INT 21H指令执行功能调用 (4) 根据出口参数分析功能调用执行情况
1、DOS键盘功能调用 通过DOS功能调用能够将键值读到AL寄存器中。 p156 表4.7 (1)1号功能调用(从键盘输入字符并能回显) 例: MOV AH,1 INT 21H ;执行后:AL=1