微机原理及应用第四章宏汇编.doc_第1页
微机原理及应用第四章宏汇编.doc_第2页
微机原理及应用第四章宏汇编.doc_第3页
微机原理及应用第四章宏汇编.doc_第4页
微机原理及应用第四章宏汇编.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

微机原理第四章: 汇编语言第四章 MASM-86宏汇编语言程序 【基本概念】 语言特点1. 机器语言: 机器码表示, 例如B8H, C3H (天书)2. 汇编语言: 用助记符表示机器码, 例机器码B8H, C3H的助记符为MOV AX, BX, CPU不同,机器码不同, 助记符不同, (难学)3. 高级语言: 语言规范, 可用于不同的CPU (常用) 语言优化1. 汇编语言: 时间, 空间均优化 但源程序复杂 2. 高级语言: 时间, 空间均较差 但源程序简单语言到机器码过程1: 机器语言 直译 2: 汇编语言 汇编, 连接 机器码3: 高级语言 编译, 连接 程序开发过程1. 源程序的编辑 产生源文件 如 *.ASM2. 目标程序的汇编( 编译) 产生目标文件 如 *.OBJ3. 执行程序的连接 产生执行程序文件 如 *.EXE 汇编程序的设计过程1 编辑: 用EDIT.COM软件设计源程序文件*.ASM2 汇编: 用MASM.EXE软件对*.ASM文件进行汇编, 产生目标文件 *.OBJ3 连接: 用LINK.EXE软件对*.OBJ文件集合进行连接, 产生执行文件 *.EXE 4.1汇编语言与汇编程序 一: 汇编语言(汇编源程序) 1: 用指令助记符表示机器码 2: 用符号地址表示存储器地址 3: 用伪指令管理源程序 二: 汇编程序 1: 用MASM.EXE 对 *.ASM源程序进行汇编 2: 汇编产生文件A: *.OBJ 浮动地址目标文件, 为连接作准备B: *.LST 指令, 机器码列表文件 1): 代码段 指令 机器码 伪指令 无机器码 2): 数据段 符号地址 段内地址量3: 汇编程序例 A: 147页图4-3为用编辑软件编写的MASM-86汇编源程 B: 145页图4-2为用汇编软件MASM.EXE汇编产生的列表文件 1): 数据段列表的特点数据类型与存储空间分配 2): 代码段列表的特点指令语句与伪指令语句 3): 符号地址与浮动地址 4.2 基本语法规范 一: 字符集 1: 字母A Z 或a z 汇编源程序中, 大小写字符功能一样 2: 数字1 9 3: 特殊符号 二: 保留字 1: 寄存器名 例AX, SP 2: 标志符 例CF, TF 3: 指令助记符 例MOV, ADD 4: 伪指令符 例SEGMENT, END 5: 运算符 例OFFSET, PTR 三: 标识符(标号, 变量名)1: 标识符的使用A: 符合字符集要求, 不使用保留字 B: 长度小于32个字符, 第一个符号最好用字母 2: 标识符的作用A: 段名定义B: 过程名, 结构名, 宏名等定义C: 数据段符号地址(地址变量名)定义 注: 地址变量具有段, 偏移量, 数据类型三种属性3: 标识符的使用特点A: 数据段的使用特点地址变量具有存储地址和数据类型的特征B: 代码段的使用特点1): 伪指令前的标号定义, 标号2): 指令前的标号定义, 标号:C: 标识符与常量 1): MOV AL, F8H 从符号地址F8H中取字节数据赋给AL, 即(AL) = F8H 2): MOV AL, 0F8H 常量F8H赋给AL, 即(AL) = F8H 4: 语句A: 指令语句 可译为机器码B: 伪指令语句 仅管理用C: 宏指令语句 宏代替, 省时不省空注: 过程调用为省空不省时5: 注释 在语句的尾部加 ;( 分号) 可写语句功能说明4.3 表达式及运算符一: 表达式 操作数段含有运算符就构成表达式 1: 数值表达式 MOV AX, 2000H +2 等于 MOV AX, 2002H 2: 地址表达式 MOV AX, 2000H + 2 等于 MOV AX, 2002H MOV AX, BUFF + 3 BUFF为符号地址, 从BUFF + 3地址单元取字数据给AX注: MOV AX, BX +2 不是地址表达式, 而是寻址方式, 可写为MOV AX, 2BX二: 运算符(151页表4-1) 1: 算术运算符 A: 数值表达式中可用所有算术运算符 B: 地址表达式仅用 +, -算术运算符 C: 算术运算符不影响标志位 例完成80H + 90H1) MOV AL, 80H + 90H (AL) = 10H CF =不变2) MOV AL, 80HADD AL, 90H (AL) = 10H CF = 1 2: 逻辑运算符A: 逻辑指令助记符与逻辑运算符 1): 逻辑指令助记符出现在指令语句的开始 2): 逻辑运算符出现在指令语句的操作数段B: AND CX, 00FFH AND 10AEH AND CX, 00AEH 3: 关系运算符 A: 两性质相同的操作数的比较1): 若关系正确为真(T), 有全1操作数2): 若关系错误为假(F), 有全0操作数 B: MOV BX, (PORT LT 5) AND 2000H) OR (PORT GE 5) AND 4000H) 注: 指令中BX为16位数据类型, 真= FFFFH, 假= 0000H1): 若 PORT = 2第一项(PORT LT 5) 为真, 第二项(PORT GE 5) 为假MOV BX, (0FFFFH AND 2000H) OR (0000H AND 4000H)MOV BX, 2000H2): 若 PORT = 7 第一项(PORT LT 5) 为假, 第二项(PORT GE 5) 为真 MOV BX, (0000H AND 2000H) OR (0FFFFH AND 4000H) MOV BX, 4000H注: C语言中的if(port 5) bx = 0x2000 else bx = 0x4000 4: 分析运算符 (数值返回运算符)A: SEG 地址变量段值属性返回符B: OFFSET 地址变量偏移量值属性返回符例:定义数据段DATA如下,从实际地址02000H开始存数据 即段地址为0200H, 段内偏移地址从0000H开始 DATA SEGMENT VAR1 DB 20, 30 VAR2 DW 2000H, 3000HVAR3 DD 22002200HDATA ENDS203000H20H00H30H00H22H00H22H VAR1(0000H) VAR2(0002H) VAR3(0006H) MOV BX, SEG VAR1 (BX) = 0200H MOV BX, SEG VAR2 (BX) = 0200H MOV BX, SEG VAR3 (BX) = 0200H MOV BX, OFFSET VAR1 (BX) = 0000H MOV BX, OFFSET VAR2 (BX) = 0002H MOV BX, OFFSET VAR3 (BX) = 0006HC: TYPE 地址变量数据类型属性返回符 1): 数据类型变量返回所含字节数量 MOV BX, TYPE VAR1 (BX) = 1 MOV BX, TYPE VAR2 (BX) = 2 MOV BX, TYPE VAR3 (BX) = 4 2): 结构名返回结构所含字节数量 STUDENT STRUC A1 DB 20H, 30H A2 DB 50H STUDENT ENDS MOV BX, TYPE STUDENT (BX) = 3 3): 过程名返回近, 远过程属性值 STAR1 PROC NEAR MOV BX, TYPE STAR1 (BX) = -1 STAR2 PROC FAR MOV BX, TYPE STAR2 (BX) = -2D: LENGTH DUP重复次数返回符E: SIZE 地址变量总字节数返回符 DATA SEGMENT VAR1 DB 100 DUP(?) VAR2 DW 100 DUP(?) DATA ENDS MOV BX, LENGTH VAR1 (BX) = 100 MOV BX, LENGTH VAR2 (BX) = 100 MOV BX, SIZE VAR1 (BX) = 100 MOV BX, SIZE VAR2 (BX) = 200 3: 综合运算符 (属性修改运算符)A: PTR 存储器操作数类型重定义 1): MUL BYTE PTR 2000H 从地址2000H中取字节操作数 MUL WORD PTR2000H 从地址2000H中取字操作数 2): VAR1 DW 2030H VAR2 EQU BYTE PTR VAR1 一个地址单元定义了两个不同数据类型的变量, VAR1为字变量, VAR2为字节变量30H20H MOV AX, VAR1 (AX) = 2030H VAR1, VAR2 MOV AH, VAR1 错误 MOV AH, VAR2 (AH) = 30HB: THIS 同地址, 不同变量类型定义符 注: 讨论THIS与PTR的应用特点, 功能一样, 用法不同 1): PTR 先定义一个变量类型 再用PTR说明一个新的变量类型 VAR1 DW 2030H 定义 VAR2 EQU BYTE PTR VAR1 说明 2): THIS 先用THIS说明一个变量类型 再定义一个新的变量类型 VAR2 EQU THIS BYTE 说明 VAR1 DW 2030H 定义C: 段属性前缀定义符 DS:, ES:, SS:, CS: 存储器寻址方式中对使用段的强制性定义 注: 82页关于缺省段, 强制段的说明D: SHORT 页内跳转定义符 E: HIGH, LOW 字分离为字节定义符 1): HIGH 分离字的高8位字节 2): LOW 分离字的低8位字节 注: MOV AH, BX ; 指令错, 源目的操作数类型不匹配 MOV AH, HIGH BX (AH) = (BH) MOV AH, LOW BX (AH) = (BL)注: 158页表4-3列出汇编语言中运算符的优先级别4.4 伪指令 一: 数据类型定义及存储器地址分配伪指令 1: 数据类型定义伪指令 A: DB 变量为字节数据类型(8位) B: DW 变量为字数据类型(16位) C: DD 变量为双字数据类型(32位) D: DQ 变量为四字数据类型(64位) E: DT 变量为十字节数据类型(80位)2: 存储器地址分配伪指令 A: 重复定义符DUP 例4.12数据段定义如下, 看重复定义符DUP的存储器分配012250122501?01?AR1AR3DATA SEGMENT AR1 DB 2 DUP (0, 1, ?) AR2 DW 2 DUP (?) AR3 DB 2 DUP (0, 1, 2DUP(2), 5)DATA ENDS B: 表达式为地址变量 AR21): DW分配16位地址 DWAVR DW OFFSET AVR1变量DWAVR的类型为16位, 变量DWAVR的值为变量AVR1的偏移地址2): DD分配32位地址 DDAVR DD AVR2 变量DDAVR的类型为32位, 变量DDAVR的值为变量AVR2的32位目标地址例4.11数据段定义如下, 存储器实际地址从02000H开始 即 DS = 0200H, EA = 0000H DATA SEGMENT DBYTE DB 10, 10H DWORD0 DW 100, 100H DDWORD DW 12345678H DQWORD DQ 1234567890ABCDEFH DBYTES DB AB DWORDS DW AB DWORD1 DW OFFSET DWORD0 DDWORD1 DD DDWORD DATA ENDS0AH10H64H00HH00H01H78H56H34H12HEFHCDHABH90H78H56H34H12H41H42H42H41H02H00H06H00H00H02H0000HDBYTE 0002HDWORD0 0006HDDWORD 000AHDQWORD 0022HDBYTES 0024HDWORDS0026HDWORD10028HDDWORD1 数据段地址 DS = 0200H DBYTE DB AB 可写为 DBYTE DB 41H, 42H DWORD DW AB 可写为 DDWORD DB 4142H DWORD1 DW OFFSET DWORD0返回16位EA = 0002H DDWORD1 DD DDWORD 返回16位EA = 0006H, 返回16位DS = 0200H 二: 符号定义伪指令EQU 及 = 1: 格式 符号 EQU 表达式符号 = 表达式注: 符号而非变量, 故用EQU定义的符号不占用存储器单元 2: EQU 与 = 伪指令的区别 A: EQU 不能重复定义B: = 可重复定义三: 程序块定义伪指令 1: 段定义伪指令 A: 段名标识符 SEGMENT 定位类型 组合类型 类别 .20H30H30H20H41H42H42H41H . ARE1 .段名标识符 ENDS ARE2 B: DATA SEGMENT ARE1 DB 20H, 30H ARE4 ARE2 DW, 2030H ARE3 EQU 30H ARE5 ARE4 DB A, B ARE5 DW AB DATA ENDS 注: 段名为标识符DATA, AEE3不占存储单元, DB, DW对符ASCII码的作用 注:168页给出定位类型,组合类型,类别的说明,一般为缺省使用 2: 段说明伪指令 A: ASSUME 段寄存器名: 段名标识符段说明伪指令在代码段的第一行定义, 指明段寄存器与段名标识符的对应关系 B: CODE SEGMENTASSUME CS:CODE, DS:DATA.CODE ENDS注:数据段寄存器DS与段名标识符DATA对应,代码段寄存器DS与段名标识符CODE对应堆栈段SS一般不定义, 也不说明, 由系统自动生成附加段ES若用可定义及说明, 一般为同DS段重叠, 但必说明3: 过程定义伪指令 A: 过程名标识符 PROC NEAR (段内调用定义, 近过程) RET 过程名标识符 ENDP B: 过程名标识符 PROC FAR (段间调用定义, 远过程) RET 过程名标识符 ENDP 注: 过程定义必须在代码段内 四: 址址计数器和地址对准器伪指令1: $ 址址计数器 表示下一个地址变量的偏移地址值例3.20(117页) COUNT EQU $ - BLOCK BLOCK的偏移地址值为0000H, PLUS的偏移地址值为000AH, $ = 000AH, COUNT = 000AH 0000H = 10, BLOCK变量定义了10字节数据2: ORG 地址对准器 下一个地址变量的偏移地址值由ORG确定02H03H04H34H12H 例4.18(171页) 0000H DATA SEGMENT 0001H ORG 2 VAR1 0002H VAR1 DB 2, 3, 4 ORG $ + 3 VAR2 DW 1234H $ DATA ENDS VAR2 0008H 五: 结构定义伪指令 STRUC / ENDS 1: 结构定义结构名标识符 STRUC 结构名标识符 ENDS注: 结构定义在数据段定义中完成 2: 结构变量定义及结构字段名赋值结构变量名标识符 结构名标识符 注: 结构变量定义及结构字段名赋值在数据段定义中完成 3: 结构字段名的引用结构变量名标识符. 结构字段名标识符结构变量名指针. 结构字段名标识符 例定义结构如下STUDENT STRUC NAME DB 4 DUP(?) NO DB ? SEX DB ?STUDENT ENDS 定义结构变量名 S1 STUDENT 注: 任何结构名必须定义结构变量名, 应用使用结构变量名而非结构名 结构字段的赋值 定义结构变量时不赋值, S1 STUDENT 定义结构变量时赋实值, S1 STUDENT 结构字段的引用MOV AL, S1.NAME (AL) = DMOV AL, S1.NAME + 2 (AL) = NMOV AL, S1.NO (AL) = 20MOV AL, S1.SEX (AL) = M注: 引用时结构变量名及结构字段名不能单独使用MOV AL, S1 错误MOV AL, NO 错误 结构变量的指针引用LEA BX, S1 (BX) = S1的存储地址值MOV AL, BX.NO (AL) = 20注: 由于指针使用灵活, 编程中大量使用指针而非变量本身例4.16164页, 有一学生姓名, 学号, 英语成绩结构, 给出三个学生数据, 显示英语不及格学生姓名 数据段定义DATA SEGMENT STUDENT STRUC NAME DB 4 DUP(?) NO DB ? ENGLISH DB ?STUDENT ENDS ; 结束结构定义S1 STUDENT S2 STUDENT S3 STUDENT ; 结构变量及赋值 DATA ENDS ; 结束数据段定义 代码段定义CODE SEGMENT ASSUME CS:CODE, DS:DATASTART PROC FAR PUSH DSMOV AX, 0PUSH AX MOV AX, DATAMOV DS, AXMOV DH, 3 ; 三个学生成员LEA BX, S1 ; (BX) = S1的地址 BEGIN: MOV AL, BX.ENGLISH ; (AL) = 70, 80, 50 CMP AL, 60 ; (AL) 与60分比较 JGE NOSHOW ;大于等于60分不显示学生姓名 MOV CX, 4 ;小于60分显示学生姓名,4字符 SHOW: MOV DL, BX=.NAME ;(DL) = D, I, N, GMOV AH, 02HINT 21H ; 依次显示D, I, N, GINC BXDEC CXJNZ SHOW ; 显示完后退出SUB BX, 4 ;指针回退到姓名的首字符存储地址NOSHOW: ADD BX, 6 ;不显示指向下一个成员(共6字节) DEC DH JNZ BEGIN ; 完成三个成员判断 RET ; 过程返回 START: ENDP ; 过程定义结束 CODE:ENDS ; 码段定义结束 END START ; 汇编源程序结束 六: 记录定义伪指令 RECORD 形式: 同结构 定义, 赋值, 引用 特点: 结构 以字节为基本单位 记录 以位为基本单位 1: 记录的定义特点记录名标识符 RECORD 注: 若定义记录总位数8位, 为字节处理 若定义记录总位数16位, 为字处理例定义学生编号, 性别, 地址码, 身体状态记录 STUDENT RECORD NAME:3, SEX:1, ADD:3, STU:1注: NAME:3可记录8个学生的编号, SEX:1可表示男(1),女(0) ADD:3可记录8个不同的地址码, STU:1可表示好(1),差(0) 若用结构定义最少需要4字节, 用记录仅1字节 2: 记录的变量定义及赋值特点记录变量名 记录名 例 S1 STUDENT S2 STUDENT 注:变量S1赋值为学生编号001,性别女(0),地址码101,身体状态好(1) 变量S2赋值为学生编号101,性别男(1),地址码111,身体状态差(0)3: 记录的引用特点 A: 记录专用运算符1): 记录名, 字段名所占二进制位数返回符 WIDTH2): 字段名在记录中的位置返回符 MASK3): 字段名右移量数据获得方法 字段名 B: WIDTH运算符的应用MOV AL, WIDTH STUDENT (AL) = 8MOV AL, WIDTH ADD (AL) = 3 C: MASK运算符的应用MOV AL, MASK NAME (AL) = 111

温馨提示

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

评论

0/150

提交评论