1 / 59

第四章 宏汇编语言程序设计

第四章 宏汇编语言程序设计. 程序设计语言概述 用于程序设计的语言分为 : 1 、 机器语言 : 用二进制表示的程序,能被机器直接识别 。 2 、 高级语言 : v b 、vc++、C#、java 等语言 。 3 、 汇编语言 : 用指令的助记符、符号地址、标号等编写成 ,面向机器的语言,8086使用的是 MASM6.X版本。. 汇编语言源程序的框架结构 例 4.1 打印输出字符串“ THIS IS A SAMPLE PROGRAM.”; DATA SEGMENT ;数据段

niel
Télécharger la présentation

第四章 宏汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章宏汇编语言程序设计 程序设计语言概述 用于程序设计的语言分为: 1、机器语言:用二进制表示的程序,能被机器直接识别。 2、高级语言:vb、vc++、C#、java等语言。 3、汇编语言:用指令的助记符、符号地址、标号等编写成,面向机器的语言,8086使用的是 MASM6.X版本。

  2. 汇编语言源程序的框架结构 例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

  3. 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

  4. 一个完整的汇编程序应该包含以下几个部分: 1.段定义(代码段、数据段、堆栈段) 段名 SEGMENT ...... 段名 ENDS 2.段分配 ASSUME CS:段名,DS:段名, SS:段名,ES:段名 3.设置段地址(代码段由机器分配) MOV AX,STACK;送堆栈段地址 MOV SS,AX MOV AX,DATA ;送数据段地址 MOV DS,AX

  5. 4.返回DOS语句及程序结束 (1)在程序开始部分的堆栈段设置后面写: • PUSH DS; • MOV AX,0 • PUSH AX • 将DS的内容及0作为段地址和偏移地址入栈,在程序结束时返回DOS. (2)在程序结束前使用DOS功能调用指令: MOV AX,4C00H INT 21H

  6. 5.过程调用(需要时) • 过程名 PROC FAR(NEAR) • ...... • 过程名 ENDP • 6.结尾语句 • END • 或 END START

  7. 源程序的结构和特点 1、由若干逻辑段组成,各段都有一个段名,由段 定义语句来进行定义和说明。 2、在代码段的起始处,用ASSUME命令来说明各个 段寄存器与逻辑段的关系。 3、每个逻辑段由若干行汇编语句组成,每行只有 一条语句,且不超过128个字符,整个源程序用 END结束。 4、每一条语句由最多由4个字段组成,每个字段 用空格分开。 5、每个源程序在代码段中都必须有返回DOS 操作系统的指令语句,保证程序执行完毕 可以返回DOS系统。

  8. 4.1 汇编语言程序格式 4.1.1指令性语句和伪指令语句 1、指令性语句->机器指令 标号:指令助记符 操作数,操作数;注释 例:mov ax,00h;把00送到ax中 2、伪指令语句->无机器指令 完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。

  9. 伪指令语句语句格式: 名字 伪指令指示符操作数,操作数;注释 名字是给伪指令取的名称,用符号地址表示,后面不带冒号,名字可以省略。 名字通常是:变量名,段名,过程名,符号名等。 例:MESSAGE DB ‘THIS IS A SAMPLE ROGRAM’ DB 0DH,0AH,’$’ DATA SEGMENT DATA ENDS ASSUME CS:CODE DS:DATA 都属于伪指令语句

  10. 4.1.2数据项 操作数可以是常数,寄存器,存储器,变量,标号或表达式。 1、常数:固定值,没有属性,是确定的数据。 例: 1101B,0F0H,100D,,2370Q,0A7F2H,‘ABC’。 2、变量:指存放在存储单元中的值,在程序运行中是可以修改的。变量具有三个属性。 (1)段值(段基址)(2)段内偏移地址(3)类型(字节) 3、标号:可执行指令语句的地址的符号表示,可作为转移指令的目标操作数。 标号亦具有三个属性: (1)段值(2)段内偏移地址(3)类型(距离)

  11. 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

  12. 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

  13. 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

  14. 4、数值返回运算符 加在变量或标号前,返回运算对象的某个参数值。 1)OFFSET 变量或标号 返回变量或标号的偏移地址值 例:MOV BX,OFFSET DA1 该指令相当于指令:LEA BX,DA1 2)SEG 变量或标号 取变量或标号的段基值。 例:MOV AX, SEG M1 MOV DS,AX

  15. 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

  16. 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

  17. 5)SIZE 变量 • 加在变量前,返回该变量包含的总字节数。SIZE=LENGTH*TYPE • 例 MOV CX,SIZE M1 • MOV BL,SIZE M2 • 得到:MOV CX,200 • MOV BL,2

  18. 5.修改属性运算符 综合运算符。通过它可以修改变量或标号的属性,包括段属性,偏移地址属性,类型属性等。 1)段操作符 格式:段前缀:变量或地址表达式 (CS,DS,ES,SS后跟冒号“:”,表示某个变量或地址被修改到段寄存器提供的段基址中) 例 MOV AX,ES:[BX];段超越到ES段

  19. 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

  20. 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

  21. 5、HIGH和LOW 格式:HIGH/LOW 变量/标号 字节分离运算符,对一个数或地址表达式,HIGH从中分离出高位字节,LOW分离出低位字节。 例 4.16K1 EQU 0ABCDH K2 EQU 1234H MOV AH,HIGH K1 MOV BL,LOW K2 六、其它运算符 1、圆括号() 用来改变运算符的优先级别,( )中的运算符具有最高优先权。 2、方括号[ ] 用来表示地址表达式或多重变量的下标值。

  22. 例 :MOV AL,M1[3] MOV CX,M2[0] MOV M3[1],CX 3、尖括号< >, 及圆点 . 在结构中专用。 4、MASK和WIDTH 运算符,在记录中专用。 WIDTH:指定记录或字段的位的长度。 MASK:字段名,8/16位二进数 七、优先级 表4.3 P134

  23. 4.2 伪指令语句 完成变量定义,存储器分配,指示程序开始和结束,段定义,段分配等 *数据定义语句:DB,DW,DD *标号赋值语句:EQU,= *段定义语句: SEGMENT … ENDS *段分配语句: ASSUME *过程定义语句:PROC … ENDP *程序开始结束语句:ORG, END

  24. 其它伪指令(不常用): • 群定义语句:GROUP • 结构定义语句:STRUC...ENDS • 记录定义语句:RECODE

  25. 4.2.1 数据定义语句 格式1:变量名 助记符 操作数,操作数...;注释 格式2:变量名 助记符 n DUP(操作数,操作数...) 功能:将操作数存入变量名指定的存储单元,或者只分 配存储空间不存入数据。 变量名—用符号表示,可以省略。 助记符:DB(字节) DW(字) DD(双字) DQ(四个字) DT(十个字) 操作数—可以是常数、字符串、变量、标号、 表达式等, 多操作数之间必须用逗号隔开。

  26. 用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第二个字为不确定量,保留二个字节空间

  27. 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

  28. 例 ONE DB 5 DUP(0);重复5个零->ONE TWO DW 10 DUP(?);保留10个字 4.2.2 表达式赋值语句(不占内存) 1.赋值语句 EQU 格式: 符号名 EQU 表达式 功能: 用来给变量,标号,常数,指令,表达式等定义一个符号名,程序中用到EQU左边的变量、标号时可用右边的常数值或表达式代替,但不能重复定义.

  29. COUNT EQU 100 DATA EQU COUNT+2 A1 EQU [BX+SI] BI EQU OFFSET A1 2.等号语句 = 功能同EQU,但用“=”定义的语句允许重复定义。 COUNT=100 COUNT=COUNT+10

  30. 4.2.3 段定义语句 1.段定义语句 SEGMENT… … ENDS 格式;段名 SEGMENT 定位类型 组合类型‘分类名’ ……;逻辑段内容 段名 ENDS 功能:将一个逻辑段定义成一个整体。 段名:是逻辑段的标识符,不可省略。上下段名必须一致。 (1)定位类型 该参数是对段起始地址定位。 PARA:段起始地址在节的整数边界,缺省时默认为PARA。 BYTE:段起始地址定位在任何字节地址。 WORD:段起始地址定位在字的边界,即首地址为偶数。 PAGE:段起始地址定位在页的边界,首址为256的整数倍。

  31. (2)组合类型 各个逻辑段之间的组合方式,各段独立,各段覆盖或顺序组合等。 NONE:各同名段互相独立,缺省参数。 PUBLIC:该段与其它同名段连接,组成一个逻辑段。 COMMON:定位该段与其它同名段有相同的首地址,采用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。 AT:定位该段的起始地址在表达式所指定的节边界上。 STACK:指定该段为堆栈段,多个模块只需设置一个堆栈段。 MEMORY:第一个逻辑段覆盖在其它同名段的最上层,其它带此参数的同名段按照COMMON方式处理。 (3)‘分类名’ 汇编程序连接时将所有分类名相同的逻辑段组成一个段组。 段定义语句允许嵌套设置,但不允许各个逻辑段相互交叉设置。

  32. 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

  33. 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

  34. 4.2.4 过程定义语句 格式: 过程名 PROC 属性 ;过程内容 RET N 过程名 ENDP 功能:定义一个过程,主程序可以用CALL指令调用它 过程名:不可缺省,它是主程序中CALL指令的目标操作数 属性:为NEAR或FAR。 过程调用允许嵌套和递归调用。

  35. 例4.30 P143过程嵌套调用格式 • MSUBPROC FAR • ... • CALL SBU1 • ... • RET • SUB1 PROC NEAR • ... • RET • SUB1 ENDP • MSUB ENDP

  36. 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 标号名 功能:标记汇编源程序结束。放在源程序的最后一行。

  37. 4.2.6 结构定义语句 • 1.结构定义 • 格式:结构名 STRUC • 数据变量 • 结构名 ENDS • 不允许超前使用。 • 数据变量类型: • (1)简单变量:一个元素 • (2)多重变量:多个元素 • (3)字符串变量:字符串 • (4)多重结构:包含另一个结构。

  38. 例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

  39. 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

  40. 3.结构的使用 例4.36 要求将AX寄存器内容写入结构副本TWO的变量T2中。 MOVE TWO.T2, AX 例4.37 将变量FOUR.T5[0]的值取出 送到BX寄存器。 MOV BX,FOR.T5[0]

  41. 例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

  42. 预置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

  43. 4.2.7 外部伪指令及对准伪指令 • 1.外部伪指令 • PUBLIC 名称,名称,...;注释 • (定义共享模块) • EXTRN 名称:类型,名称,类型,...;注释 • (调用共享模块) • 名称是下列种类,则类型对应: • 名称 类型 • 变量 BYTE/WORD • 标号 NEAR/FAR • 常数 ABS • 例4.39 page149

  44. 2.对准伪指令 格式:EVEN 功能:使下条语句的地址调整为偶地址。 例4.40 3.LABEL 格式:名称 LABEL 类型属性 功能:给已定义的变量或标号取另一个名字, 并可重新定义它的类型属性,使同一变量或 标号在不同地方被引用时,可采用不同的名 字,具有不同的类型属性,提高了程序的灵 活性。

  45. 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

  46. 例4.44 • DISF LABEL FAR • DISN: MOV AX,[SI] • DISF与DISN指向同一条指令,DISF是DISN的别名。 • 但距离属性改为FAR,当其它代码对它调用时, • 可以使用。

  47. 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即可。

  48. DOS系统功能调用 实现设备管理,文件读/写,文件管理和目录管理等功能. 设备管理:键盘输入、显示输出、设置磁盘缓冲区、选 择当前盘等功能调用 目录管理:查找目录项、更改目录项、建立子目录等 文件管理:打开文件、建立文件、读写文件、删除文件等 调用格式: (1) 系统功能号送到AH寄存器 (2) 入口参数送到指定寄存器 (3) 用INT 21H指令执行功能调用 (4) 根据出口参数分析功能调用执行情况

  49. 1、DOS键盘功能调用 通过DOS功能调用能够将键值读到AL寄存器中。 p156 表4.7 (1)1号功能调用(从键盘输入字符并能回显) 例: MOV AH,1 INT 21H ;执行后:AL=1

More Related