第3章 80x86汇编语言程序设计(上) 时间不够的情况下只讲16位汇编 注:本章中,用此颜色和字型说明的文字只适用于32位汇编.

Slides:



Advertisements
Similar presentations
第1章第1章 PC/AT 系統 1 Chapter 1 Chapter 1 PC/AT 系統 001.
Advertisements

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第10章 DOS功能调用与BIOS中断调用.
第四章 80x86汇编语言程序设计 第一节 汇编语言概述 第二节 汇编语言语句的组成 第三节 汇编语言的语句 第四节 宏汇编指令 第一节 汇编语言概述 第二节 汇编语言语句的组成 第三节 汇编语言的语句 第四节 宏汇编指令 第五节 编写完整的汇编语言程序 第六节 汇编语言程序设计.
第四章 汇编语言 程序设计 任课教师:王晓甜
C语言实验 第一课 标题:学号+姓名.
第一章 计算机基础知识 第一节 计算机概述 一、计算机的基本组成和工作原理 二、有关术语 三、计算机发展简史 四、微型计算机概述
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
IBM-PC 汇编语言程序设计 教师:袁南儿.
第3章 80x86汇编语言程序设计(下).
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
第5章 汇编语言程序设计 5.1 宏汇编语言的基本语法 5.2 伪指令 5.3 宏指令 5.4 汇编语言程序的结构
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
第四章 汇编语言程序格式 4.1 汇编语言语句种类及其格式
第4章 汇编语言程序设计 4.1 汇编语言概述 4.2 汇编语言源程序格式 4.3 汇编语言程序设计 4.4 DOS功能调用.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
逆向工程-汇编语言
微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日.
第四章 典型CPU及指令系统举例.
第2章 汇编语言与汇编程序 ——8086/8088指令系统 mov ax,12h call display Jmp 1234h.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第3章 80x86汇编语言程序设计(上) 时间不够的情况下只讲16位汇编 注:本章中,用此颜色和字型说明的文字只适用于32位汇编.
第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计
第3章 寻址方式 罗文坚 中国科大 计算机学院
第3章 8086/8088指令系统 mov ax,12h call display Jmp 1234h.
微机原理及应用 主讲:郑海春.
走进编程 程序的顺序结构(二).
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第二章 Java语言基础.
逆向工程-汇编语言
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
教师:王晓甜 8086CPU 指令系统 教师:王晓甜
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第7章 在C/C++中使用汇编 罗文坚 中国科大 计算机学院
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第3章 指令系统和寻址方式 3.1指令系统概述 /8086CPU的寻址方式 3.3 指令的机器码表示方法(略)
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
第4章 Excel电子表格制作软件 4.4 函数(一).
第九节 赋值运算符和赋值表达式.
College of Computer Science & Technology
微机原理与接口技术 ——8086微处理器 西安邮电大学 计算机学院 范琳.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
顺序结构程序设计 ——关于“字符串”和数值.
Presentation transcript:

第3章 80x86汇编语言程序设计(上) 时间不够的情况下只讲16位汇编 注:本章中,用此颜色和字型说明的文字只适用于32位汇编

3.1 80x86的寻址方式 有效地址(effective address EA) —— 操作数在段内的偏移地址 寻址方式 —— 产生有效地址的方法 80x86指令的一般汇编语言格式: [标号:]指令助记符[[目的操作数][,源操作数]][;注释] 其中[ ]表示可选项; 3.1.1 操作数寻址 80x86的操作数寻址方式有: 1、立即寻址 2、寄存器寻址 3、存储器寻址 4、端口寻址

我们首先讨论两种与存储器无关的寻址方式: 1、立即寻址 操作数以常量形式直接放在指令中,紧跟在操作码之后 机器码存放形式如下: 代码段 代码段 低地址 OP 操作码 OP 操作码 D8 D16低8位 8位操作数 高地址 16位操作数 D16高8位 立即寻址示例 MOV AH, -40 ; -40AH MOV AX, 34D8H ; 34HAH, 0D8HAL MOV AX, -40 ; 0FFD8H(-40)AX MOV EAX, 12345678H ;12345678HEAX

MOV AH, BL ;(BL)-->AH MOV DS, AX ;(AX)-->DS 2、寄存器寻址 操作数存放在某个寄存器中,指令指定寄存器号 指令 寄存器 寄存器号 操作数 寄存器寻址示例 MOV AH, BL ;(BL)-->AH MOV DS, AX ;(AX)-->DS MOV SI, AX ;(AX)-->SI MOV ECX, EDX ;(EDX)ECX 说明:立即寻址和寄存器寻址方式不需再次访问存储器即可得到操作数,速度快

下面我们来讨论余下的几种与存储器有关的寻址方式,先介绍几个概念: 有效地址(EA)的4种组成成分: 有效地址的计算: EA=基址 +(变址*比例因子)+ 位移量 位移量(displacement) 存放在指令中的8位、16位或32位的数,是一个地址 基址(base) 存放在基址寄存器中的内容,用于指向数组的首地址 变址(index) 存放在变址寄存器中的内容,用于访问数组的某个元素 比例因子(scale factor) 其值可为1,2,4或8,386及其后继机型新增加的

16/32位寻址时有效地址四种成分的组成 四种成分 16位寻址 32位寻址 位移量 0,8,16位 0, 8, 32位 基址寄存器 BX, BP 任何32位通用寄存器(包括ESP) 变址寄存器 SI, DI 除ESP以外的32位通用寄存器 比例因子 无 1, 2, 4, 8

除相对于堆栈以及串处理的目的串以外的所有数据访问 默认段选择规则 访存类型 所用段及寄存器 缺省选择规则 指令 代码段 CS 用于取指 堆栈 堆栈段 SS 所有的堆栈的进栈和出栈 任何用BP,ESP,EBP作为基址寄存器的访存 目的串 附加数据段 ES 串处理指令的目的串 局部数据 数据段 DS 除相对于堆栈以及串处理的目的串以外的所有数据访问

访问非默认段数据的方法——段超越 数据的存放比较灵活,除了放在默认的DS段,还可以存放在别的段,此时访问他们需要使用段超越前缀,可用的段超越前缀有CS:, DS:, ES:, SS:, FS:, GS:。 段超越举例: MOV AX, [10H] ;DS段10H处的一个字的数据赋给AX寄存器 MOV AX, ES:[10H]; ES段10H处的一个字的数据赋给AX寄存器 不允许使用段超越前缀的情况: (1)串操作指令的目的串必须用ES段 (2)PUSH指令的目的和POP指令的源必须用SS段 (3)程序的指令必须存放在CS段

3、直接寻址 操作数地址的偏移量(EA)在指令中 段基地址 存储器 指令 操作数 EA + 物理地址=指定段的段基地址×16+偏移量(EA) 系统默认,操作数在数据段 MOV AX, 2000H ; 立即寻址 MOV AX, [2000H] ; 直接寻址

直接寻址示例1 MOV AX, [1000H] 物理地址 设(DS)=10A0H 代码段 + OP 00H 10H 数据段 代码段 + OP 00H 10H 数据段 11A00H 30H 50H 1000H 10A0H 10A00H 1000H 低地址 11A00H 11A00H 主意提醒段地址×16(左移4位) 30H 50H AX 50H 30H (本章中图示存储器地址从上到下递增)

直接寻址示例2 MOV BL, ES:[0100H] 物理地址 设(ES)=3000H 30000H (DS)=2000H + 0100H 30100H 4B 00 BL 0100H 3000H 30100H 30100H 4B 4B 在汇编语言指令中,可以用符号地址代替数值地址 如:MOV AX, BUFF 或 MOV AX, [BUFF] 其中BUFF为存放数据单元的符号地址。

段基地址 指令 寄存器 存储器 基址或变址寄存器号 EA + 操作数 寄存器间接寻址示例 MOV AL, [BX] 4、寄存器间接寻址 操作数在存储器中,操作数地址的偏移量(EA)在寄存器中 段基地址 指令 寄存器 存储器 基址或变址寄存器号 EA + 操作数 寄存器间接寻址示例 MOV AL, [BX] MOV AX, CS:[SI] MOV [BP], AH MOV ECX, [EDX]

… MOV AH, [BP] MOV BX, [SI] MOV CX, SI 设 (SS)=1000H, (DS)=2000H , (BP)=0B10H, (SI)=032AH 物理地址 物理地址 10000H 20000H + 0B10H + 032AH 40H 00H 3EH 46H 1000H 2000H 0B10H 032AH 10B10H 10B10H 2032AH 2032AH AH 10B10H 40H 032AH 40H 032AH SI 10B11H … 032AH CX 2032AH 3EH 463EH BX 2032BH 46

5、基址寻址 指 令 段基地址 基址寄存器号 位移量 存储器 EA + + 操作数 基址寄存器 地址 可用于数组元素的访问 操作数的有效地址是基址寄存器的内容加上指令中指定的位移量 指 令 段基地址 基址寄存器号 位移量 存储器 EA + + 操作数 基址寄存器 地址 可用于数组元素的访问

基址寻址示例 MOV AX, 3000H[BX] (或[BX+3000H]) MOV AX, COUNT[BX] ; COUNT是符号地址 (或 MOV AX,[COUNT+BX]) 若(DS)=3000H, (BX)=2000H,COUNT=4000H 30000H 2000H + 4000H 3000H 2000H 4000H 36000H 36000H 36000H 34H 12H 34H 12 1234H AX

6、变址寻址 1)无比例因子的变址寻址(16位寻址) 操作数的有效地址是变址寄存器的内容加上指令中指定的位移量 指 令 段基地址 变址寄存器号 位移量 存储器 操作数 + + 变址寄存器 EA 地址

变址寻址示例 MOV CX, 6020H[SI] (或[SI+6020H]) MOV DX, COUNT[SI] ; COUNT是符号地址 (或 MOV AX,[COUNT+SI]) 若(DS)=3000H, (SI)=2000H,COUNT=1000H 30000H 2000H + 1000H 3000H 2000H 1000H 33000H 33000H 33000H 34H 67H 34H 67 6734H DX

2)有比例因子的变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子及位移量之和 指 令 变址寄存器 比例因子位移量 段基地址 变址寄存器 存储器 EA 变址值 下标 操作数 * + +

有比例因子的变址寻址示例 MOV EAX, COUNT[ESI*4] EA=ESI*4+COUNT 设(ESI)=3,(DS)=1000H 存储器 EA=ESI*4+COUNT 设(ESI)=3,(DS)=1000H COUNT=2000H 12000H +1 +2 +3 +4 元素0 元素1 EAX 元素2 +12 元素3

7、基址变址寻址 1)无位移量的基址变址寻址 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和 指 令 变址寄存器 段基地址 基址寄存器变址寄存器 变址值 存储器 操作数 + + 基址寄存器 EA 基址值

无位移量基址变址寻址示例 MOV AX, [BX+DI] MOV AX, [BX][DI] 若 (DS)=2100H, (BX)=0158H, (DI)=10A5H, 2100H 0158H 物理地址 21000H 0158H + 10A5H 10A5H 221FDH 221FDH 221FDH 34H 12H 34H 12 1234H AX

2)基址变址相对寻址 操作数的有效地址是一个基址寄存器的内容、 一个变址寄存器的内容及位移量之和 指 令 基址寄存器变址寄存器位移量 段基地址 存储器 变址寄存器 EA 变址值 + + 操作数 基址值 基址寄存器

基址变址相对寻址示例 MOV AX, MASK[BX+SI];MASK是符号地址 若 (DS)=3000H, (BX)=2000H, (SI)=1000H, MASK=0250H 物理地址 30000H 2000H 1000H + 0250H 33250H 20H 43H 3000H 2000H 1000H 0250H 33250H 33250H 20H 43 4320H AX

3)基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令 中指定的比例因子加基址寄存器的内容之和 指 令 基址寄存器变址寄存器比例因子 变址寄存器 变址值 下标 * 段基地址 存储器 基址寄存器 EA 基址值 操作数 + + 基址比例变址寻址示例 MOV ECX, [EBX+ESI*8]

4)相对基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加基址寄存器的内容、再加位移量之和 指 令 基址寄存器变址寄存器比例因子位移量 段基地址 变址寄存器 存储器 变址值 EA 下标 操作数 * + + 基址寄存器 基址值 相对基址比例变址寻址示例 MOV EAX, TABLE[EBX+EDI*4]

8、端口寻址 1)直接寻址(I/O Port Direct Addressing) 直接寻址是使用一字节立即数寻址,因此I/O端口的寻址范围为00H~FFH,最多为256个。 IN AL, 20H ;从20H端口读入1个字节 OUT 60H, AX ;将AX中1个字送到60H端口 2)间接寻址(I/O Port Indirect Addressing) 间接寻址由DX寄存器间接给出I/O端口地址,为两个字节,所以最多可寻址216=64K个端口地址。 MOV DX, 3FCH IN AL, DX ;从3FCH端口读入1个字节

3.1.2 转移操作寻址 直接寻址(段间) 指令中直接提供了转向段地址和偏移地址,用指令中提供的偏移地址取代IP寄存器,用指令中提供的段地址取代CS寄存器的内容就完成从一个段到另一个段的转移操作。 JMP FAR PTR NEXT_PRO 该程序在判断跳转偏移的时候,当前IP值已经是0005,所以跳转偏移为-5 (FBH) 机器码是16进制

相对寻址(当前段内) 转向的有效地址是当前IP寄存器的内容和指令中指定的位移量之和 位移量只有8位的为短(short)转移或条件转移 位移量有16位的为近(near)转移 偏移量 机器码 程序 0000 0405 PROG_S: ADD AL,05H 0002 90 NOP 0003 EBFB JMP SHORT PROG_S 0005 该程序在判断跳转偏移的时候,当前IP值已经是0005,所以跳转偏移为-5 (FBH) 机器码是16进制

间接寻址 段内间接寻址 转向有效地址是一个寄存器或是两个字节存储单元的内容 。所得到的转向的有效地址用来取代IP寄存器的内容。 设:(DS)=2000H,(BX)=1000H,变量TABLE的有效地址为1000H,(21000H)=0040H,(22000H)=5678H,则下列三条指令分别执行后结果如下: JMP BX ;执行后IP=1000H JMP [BX] ;执行后IP=0040H JMP TABLE[BX] ;执行后IP=5678H

间接寻址 段间间接寻址 用存储器中的相继的四个字节的内容来取代IP和CS寄存器中的原始内容以达到段间转移的目的。 设:(DS)=2500H,(SI)=1300H,(26300H)=4500H,(26302H)=32F0H, 则执行以下指令后结果如下: JMP DWORD PTR [SI];执行后CS=32F0H,IP=4500H

3.2 80x86汇编语言格式 汇编语言源程序结构 汇编语言上机过程 汇编语言语句格式 伪操作(伪指令)

3.2.1 源程序结构概览 数据段 说明: 堆栈段 1、各段顺序无关 2、除代码段外,可缺省 3、可有若干个数据段, 若干代码段 代码段 堆栈段 1、各段顺序无关 2、除代码段外,可缺省 3、可有若干个数据段, 若干代码段 代码段 END [标号] 附加段

汇编语言程序例 数据段 代码段 .DATA BUF1 DB 34H ;变量定义 BUF2 DB 2AH SUM DB ? .CODE START: MOV AX, @DATA MOV DS, AX ; 段寄存器赋值 MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CH INT 21H ; 程序退出 END START 代码段

3.2.2 汇编语言程序上机过程 源程序 .asm 目标程序 .obj 可执行程序 .exe debug DOS下执行 汇编 连接 masm link 可执行程序 .exe 修改 调试 debug 调试 这里最好现场演示MASM5 包中sample.asm的编译连接过程 执行 DOS下执行 更多细节以及在VC6中实现C++中嵌入汇编请看 《汇编语言上机过程(自学).ppt》

3.2.3 汇编语言语句格式 有三类语句: 指令语句——完成操作功能,能翻译成机器指令 伪指令语句——为汇编程序在翻译源程序时提供 有关信息 宏指令语句——由若干条指令语句组成的语句 指令语句格式 [符号名:]指令助记符[目的操作数[,源操作数]][;注释] 伪指令语句格式: [符号名] 伪操作 [操作数[,操作数, …]] [;注释]

由用户按一定规则定义的标识符,有标号和变量两种形式,在指令格式中用的是标号。可用符号是: 字母:A--Z, a--z 数字符: 0--9 一、指令语句格式 1、符号名 由用户按一定规则定义的标识符,有标号和变量两种形式,在指令格式中用的是标号。可用符号是: 字母:A--Z, a--z 数字符: 0--9 专用字符:?, _, @, $ 长度不超过31个字符, 首字符不能为数字,不能和保留字同名。 2、指令助记符 指令助记符是汇编指令的符号代码,不可缺省。 汇编源程序时,系统使用内部对照表将每条指令的 助记符译成相应的机器码。 此页学生自学为主,以作业代之 保留字包括寄存器名、指令助记符、伪指令等

除立即寻址方式外,其他寻址方式均适用于目的操作数. 3、目的操作数 1)参与指令操作 2)暂存操作结果 除立即寻址方式外,其他寻址方式均适用于目的操作数. 4、源操作数 提供原始数据或操作对象,面向所有寻址方式 5、注释 注释在系统汇编时并不产生机器码 注释可以放在指令语句尾,也可单独使用 注释前面的“;”不可缺少 此页学生自学为主,以作业代之 指令举例: START: MOV AX, 2000H MOV DS, AX ;为DS寄存器赋值

十六进制数 以H结尾,如5BH,当最高位为‘A’~‘F’,则在最高位前加‘0’ 2、字符串常量 二、常量 常量有两种: 1、数值常量 二进制数 以B结尾,如01011101B 八进制数 以Q结尾,如235Q 十进制数 以D结尾或没有结尾字母,如98D或98 十六进制数 以H结尾,如5BH,当最高位为‘A’~‘F’,则在最高位前加‘0’ 2、字符串常量 用单引号括起来的一个或多个字符,如‘A’、‘AB’ 字符用ASCII码形式存储 此页学生自学为主,以作业代之 常量的应用: (1)在指令语句中作立即数 MOV CX, 100 (2)在指令语句中作位移量 MOV AX, 34[SI] (3)在数据定义语句中作初值 X DB 12H, 34H,’abcd’

三、变量和标号 变量用来代表数据所在存储单元的地址,在数据段、附加段和堆栈段中使用,变量与其所代表的数据用空格隔开。变量有三种属性: 1、段属性——变量所在段的起始地址 2、偏移属性——从段起始地址到定义变量的位置之间的字节数 3、类型属性——该变量所保留的字节数 DB 1个字节 DW 2 个字节 DD 4个字节 DQ 8个字节 DT 10个字节

标号用来代表一条指令所在存储单元的地址,在代码段中使用。标号与其代表的指令间用冒号隔开。标号也有三种属性: 1、段属性——定义标号所在段的起始地址 2、偏移属性——从段起始地址到定义标号的位置之间的字节数 3、类型属性——表示它的转移特性 NEAR (近) 段内转移 FAR (远) 段间转移

3.2.4 汇编伪指令 伪指令:帮助汇编程序正确翻译源程序的命令,本身不生成任何机器指令) 处理器选择伪指令 数据定义和存储器分配伪指令 3.2.4 汇编伪指令 伪指令:帮助汇编程序正确翻译源程序的命令,本身不生成任何机器指令) 处理器选择伪指令 数据定义和存储器分配伪指令 表达式赋值伪指令 地址计数器与对准伪指令

(一)处理器选择伪指令 当源程序使用了286及以上的机型新增加的指令时,应该在程序开始使用相应的处理器选择伪指令。 .8086 可使用8086指令(一般不用写) .286 可使用80286指令 .286P 可使用保护方式下的80286指令 .386 可使用80386指令 .386P 可使用保护方式下的80386指令 .486 可使用80486指令 .486P 可使用保护方式下的80486指令 .586 可使用Pentium指令 .586P 可使用保护方式下Pentium的指令 .686 可使用Pentium Pro指令 .686P 可使用保护方式下Pentium Pro的指令 .MMX 可使用MMX指令 .XMM 可使用SSE指令 简单提一下 当源程序使用了286及以上的机型新增加的指令时,应该在程序开始使用相应的处理器选择伪指令。

(二)数据定义伪指令 格式:[变量名] 定义符 操作数项表 操作:为变量分配存储单元并将初值置入相应单元中 定义符可为: DB—— 定义字节 DW ——定义字(2个字节) DD——定义双字(4个字节) DF——定义六字节 DQ——定义八字节 DT——定义十字节 操作数项可为: 1、常数或表达式 2、字符串 3、?表达式 4、带DUP 的表达式 操作数项表: 操作数项[, 操作数项[, 操作数项…]]

X5 DB 10, 20, 30 ;多项定义,X5被分配3个字节,初值分别为10,20,30,地址从低到高,各个值间用逗号分开 操作数是常数或表达式 X1 DB 40H ;为X1分配1个字节,初值40H X2 DW 250*250 ;为X2分配2个字节,初值62500 X3 DD 10203040H ;为X3分配4个字节,初值为10203040H X4 DQ (120+50)/10 ;为X4分配8个字节,初值17 X5 DB 10, 20, 30 ;多项定义,X5被分配3个字节,初值分别为10,20,30,地址从低到高,各个值间用逗号分开 点到为止

操作数为字符串 STRING1 DB ‘HELLO’ STRING2 DB ‘H’, ‘E’, ‘L’, ‘L’, ‘O’ 字符串用DB定义,被定义串以单引号括起来 串中可包含数字符、大小写英文字母、回车符、 换行符、 空格、?、$、下划线_等 字符串以ASCII码形式存储在存储单元中。 STRING1 ‘H’ +1 ‘E’ +2 ‘L’ +3 ‘L’ +4 ‘O’

区分 S1 DB ‘AB’ 与 S2 DW ‘AB’ 它们的存储情况为: S1 S2 ‘A’ ‘B’ ‘B’ ‘A’ 操作数项为? ?用于预留空间,不置初值 Y1 DB 20H, ? ;定义2个字节,其中预留1个字节 Y2 DW ?, ? ;预留2个字 Y3 DD ? ;预留4个字节 Y4 DQ ? ;预留8个字节 Y5 DT ? ;预留10个字节 操作项为?的点到为止

VAR2 DB 2 DUP(?, 2 DUP(‘A’, ‘B’) ) 存储情况为: VAR1 02H VAR2 ? 格式: N DUP(操作数项表) 操作:将操作数项表内容重复定义N次 VAR1 DW 2 DUP(2, 4), 1476H VAR2 DB 2 DUP(?, 2 DUP(‘A’, ‘B’) ) 存储情况为: VAR1 02H VAR2 ? 00H ‘A’ 04H ‘B’ 02H ‘B’ 00H ? 04H ‘A’ 00H ‘B’ 76H ‘A’ 14H ‘B’ 略详细点解释,尤其是嵌套的情况

操作数运算符 算术运算符 逻辑运算符 关系运算符 数值回送运算符 属性运算符 运算符优先级 48

算术运算符(单目+, 单目-, +, -, *, /, MOD) 运算符 格 式 运 算 + +表达式 取表达式正值 运算符 格 式 运 算 + +表达式 取表达式正值 - -表达式 取表达式负值 + 表达式1+表达式2 求表达式1、表达式2之和 - 表达式1-表达式2 求表达式1、表达式2之差 * 表达式1*表达式2 表达式1、表达式2之积 / 表达式1/表达式2 表达式1、表达式2之商 MOD 表达式1 MOD 表达式2 取余数 说明: 1、算术运算符可用于数值表达式或地址表达式 2、用于地址表达式时,只有其结果有物理意义时才有效 常用的是:地址+数字常量 (结果是地址) 地址-数字常量 (结果是地址) 地址-地址 (结果是常量) 这张幻灯重点将用于地址表达式的加和减

算术运算符示例 (1) MOV AL, 20+30 ;50-->AL MOV BH, 100-2 ;98-->BH MOV CX, 50/2 ;25-->CX MOV AL, 80 MOD 15 ;5-->AL (2) 将首地址为BLOCK的字数组的第6个字传送到DX: MOV DX, BLOCK+(6-1)*2 ; 地址+常量,结果仍为一地址值 (3) 设数据定义如下: ARRAYA DW 1, 2, 3, 4, 5, 6, 7 WENDA DW ? 将数组长度(字数)存入CX: MOV CX, (WENDA-ARRAYA)/2 ; 地址-地址,结果为一常量

逻辑运算符(NOT,AND,OR,XOR) 运算符 格 式 运 算 NOT NOT 表达式 按位取反 AND 表达式1 AND 表达式2 按位“与”运算 OR 表达式1 OR 表达式2 按位“或”运算 XOR 表达式1 XOR 表达式2 按位“异或”运算 逻辑运算符和逻辑运算指令的区别: 逻辑运算指令 逻辑运算符 出现在语句的位置 指令助记符 操作数字段 操作对象 可以是寄存器或 只能是整型常数 存储器操作数 何时计算 程序运行时 源程序汇编时

关系运算符(EQ,NE,LT,LE,GT,GE) 运算符 格 式 运 算 EQ 表达式1 EQ 表达式2 表达式1=表达式2为真 NE 表达式1 NE 表达式2 表达式1<>表达式2为真 LT 表达式1 LT 表达式2 表达式1<表达式2为真 LE 表达式1 LE 表达式2 表达式1<=表达式2为真 GT 表达式1 GT 表达式2 表达式1>表达式2为真 GE 表达式1 GE 表达式2 表达式1>=表达式2为真 关系运算符的两个操作数必须都是常量或同一段内的符号地址,比较结果为逻辑值:如果关系成立,则返回0FFFFH(真);否则,返回0(假)。

逻辑运算符示例 MOV AH, NOT 0F0H ;0FHAH MOV BL, 40H OR 0B4H ;0F4HBL MOV BL, 55H XOR 48H ;1DHBL MOV CH, 50H AND 30H ;10HCH 关系运算符示例 N1 EQU 10 N2 EQU 20 ……... MOV BX, N1 EQ N2 ; 0  BX MOV CX, N1 NE N2 ;0FFFFH  CX MOV AX, N1 LT N2 ;0FFFFH  AX MOV DI, N1 GE N2 ;0-->DI

(SEG,OFFSET,TYPE,LENGTH,SIZE) 数值回送运算符对变量或标号进行分析,回送其地址属性值或变量特征值。 (1)地址回送运算符 符号 作用对象 操 作 SEG 变量或标号 返回其所在段的段基址值 OFFSET 变量或标号 返回其在段内的偏移量 这一章要强调,因为编程用的会很多

(2)符号特征回送运算符 符号 作用对象 操 作 TYPE 变量或标号 用数字表示其类型属性 LENGTH 变量 用DUP重复定义符定义的变量 ,返回分配的元素个数;其他 形式,则返回1 SIZE 变量 回送LENGTH*TYPE之积

TYPE 运算符 类型属性 运算结果 变量 DB 1 DW 2 DD 4 DQ 8 DT 10 标号 NEAR -1 FAR -2

MOV BX, SEG NUM2 ;NUM2与NUM1段基址值相同 数值回送运算符示例 .DATA NUM1 DB 10 DUP(10) ;数据定义 NUM2 DB 10H, 20H, 50H NUM3 DW 20 DUP(0, 4 DUP(2)) NUM4 DB ‘STRING’ .CODE MOV AX, SEG NUM1 MOV BX, SEG NUM2 ;NUM2与NUM1段基址值相同 MOV SI, OFFSET NUM1 ;NUM1的偏移量-->SI MOV DI, OFFSET NUM2 ;NUM2的偏移量-->DI LEA对所有存储器操作数的寻址方式 OFFSET只对变量和标号表示的直接寻址有用 MOV AH, TYPE NUM3 ; 2-->AH MOV BH, LENGTH NUM3 ;20-->BH(最外层) MOV CL, SIZE NUM4 ;1*1-->CL MOV CH, SIZE NUM3 ;20*2-->CH

属性运算符 (PTR, SHORT) PTR 格式: 类型 PTR 表达式 操作: 对存储器寻址的表达式,类型可为BYTE,WORD,DWORD, QWORD和TBYTE; 表达式为标号时,类型可为NEAR或FAR。 该运算符显式指定表达式的类型 SHORT 格式: JMP SHORT 标号 操作: 转移的距离属性为短,即转移范围为-128~+127字节

MOV AX, WORD PTR DATA1 ;(AX)<--2010H (1)DATA1 DB 10H, 20H, 30H DATA2 DW 4023H, 1A00H ;数据定义 ...... MOV AX, WORD PTR DATA1 ;(AX)<--2010H MOV BL, BYTE PTR DATA2 ;(BL)<--23H PTR运算符指明DATA1由原来的字节变量临时 改变为字变量,而字变量DATA2则临时变为字节变量, 所谓临时是指在当前指令语句中有效,而存储分配情况 并不改变。 重点讲 (2) MOV BYTE PTR[SI], 60H ;字节传送 SUB WORD PTR[BX], 36H ;字数据减 JMP FAR PTR S1 ;段间转移

2 PTR,OFFSET,SEG,TYPE, 属性与数值回送运算符 3 +,- 符号运算符 4 *,/,MOD 算术运算,移位运算符 本课件涉及到的运算符优先级 优先级 运算符 类 别 1 LENGTH,SIZE 数值回送运算符 2 PTR,OFFSET,SEG,TYPE, 属性与数值回送运算符 3 +,- 符号运算符 4 *,/,MOD 算术运算,移位运算符 5 +,- 算术运算符 6 EQ,NE,LT,LE,GT,GE 关系运算符 7 NOT 逻辑运算符 8 AND 逻辑运算符 9 OR,XOR 逻辑运算符 说明:优先级1最高,而优先级9最低 圆括号()可改变执行顺序 点到为止,不细讲

(三)表达式赋值伪指令(EQU,=) 格式:名字 EQU 表达式 名字 = 表达式 操作:为表达式取一个名字,供以后引用 说明: 1、表达式可为常数、变量、标号、指令助记符、字符串 2、在一个源程序中,被EQU伪指令赋值的符号不能 再次赋值,而用=定义的符号名可重复定义. 3、赋值语句仅在汇编源程序时,作为替代符号用, 不产生目标代码,也不占有存储单元

赋值伪指令示例 CONST EQU 100*2 ;定义符号常数 ADDRS EQU [BX+10] ;为地址表达式定义名字 CHAR EQU ‘COMPUTER’ ;为字符串定义名字 COUNT = AX ;给寄存器定义名字 ... MOV BX, CONST ;引用 MOV BX, COUNT MOV ADDRS, 20 等同于 MOV BX, 100*2 MOV BX, AX MOV [BX+10], 20

(四)地址计数器与对准伪指令 1)地址计数器$ —— 当前位置的有效地址 示例1 ARRAY DW 1, 2, $+4, 3, 4, $+3 ARRAY 01h 0074H 00 02h 0076H 7Ch 0078H 03h 007AH 04h 007CH 81h 007EH 示例1 ARRAY DW 1, 2, $+4, 3, 4, $+3 示例2 BUFFER DB 1, 2, 3, 4, 5 COUNT EQU $-BUFFER 数据定义的结果:COUNT的值即为BUFFER的长度 示例3 OUT 21H, AL JMP $+2 ; 跳转到下一句 MOV AX, 0

2)定位伪指令 格式1: ORG 表达式 格式2: ORG $+表达式 功能:将表达式的值送入程序计数器 $ 表示程序计数器的当前值 定位伪指令示例 10H 20H .DATA 11H 30H ORG 10H X DB 20H, 30H ORG $+5 17H 40H Y DB 40H, 50H 18H 50H

3.2.5汇编语言源程序结构 程序开始与结束伪指令 常用的程序退出的方法 段定义结构 完整段定义伪指令 模式选择伪指令 简化段定义伪指令

操作2:没有NAME时,用其前6个字符作为模块名 可在列表文件中打印标题 (一)程序开始和结束伪指令 1)程序开始伪指令 (可省) 格式1: NAME 模块名 操作1: 用此名作为模块名 如缺省则以模块的源程序文件名为模块名 格式2:TITLE 文本 操作2:没有NAME时,用其前6个字符作为模块名 可在列表文件中打印标题 模块命名伪指令示例 NAME MODE1 …… NAME MODE2 TITLE EXAM

2)源程序结束控制伪指令 (不可省) 格式1:END 格式2:END 符号地址 功能:告诉汇编程序,源程序到此结束,并将符号地址 所示单元的段基址和偏移量自动装入CS和IP中 源程序结束控制伪指令示例 .CODE START: ...... END START 说明: 源程序从标号START处开始执行

使用DOS功能调用的4CH功能: MOV AH, 4CH INT 21H (二)常用的程序退出的方法 使用DOS功能调用的4CH功能: MOV AH, 4CH INT 21H 使用INT 20H指令 利用程序段前缀法(在子程序一节介绍) 68

使用DOS功能调用的4CH功能: .DATA BUF1 DB 34H BUF2 DB 2AH SUM DB ? .CODE START: MOV AX, @DATA MOV DS, AX MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CH INT 21H END START

(三) 段定义结构 1)简化的段定义伪指令 数据段定义伪指令 格式:.DATA [名字] 功能:定义数据段,若有多个数据段,用名字区别。 栈段定义伪指令 格式:.STACK [长度] 功能:定义一个栈段,并形成SS及SP的初值,SP的默认值为1024,隐含段名为@STACK 本页不讲,学生自学 代码段定义伪指令 格式:.CODE [名字] 功能:定义代码段,若有多个代码段,用名字区别。 只有一个代码段时,段名为@CODE

2)模式选择伪指令 格式:.MODEL 模式选择符 功能:指明简化段所用内存模式 缺省使用Small模式 Tiny模式(微模式):所有数据和代码放入同一物理段内, 可写成 .COM文件形式 Small模式(小模式):所有数据放在一个64KB的段, 所有代码放在一个64KB的段 Medium模式(中模式):所有数据放在一个64KB的段, 代码可放在多个段 Compact模式(压缩模式) :所有代码放在一个64KB的段, 数据可放在多个段 Large模式(大模式):代码和数据都可用多个段 Huge:与Large相同,但数据段大小可超过64KB Flat : 允许用户用32位偏移量 本页不讲,学生自学 缺省使用Small模式

3)指定段寄存器伪指令 格式: ASSUME 段寄存器:段名[,段寄存器:段名[...]] 操作: 明确段与段寄存器的关系。 说明: 1、代码段中可以包含至少一个ASSUME语句 2、ASSUME可以出现在源程序中的任意地方 3、仅说明段与段寄存器的对应关系,除了在程序装入时将代码段和堆栈段的段基址赋值给CS和SS外,并没有把数据段和附加段的段基址值送入DS、ES、GS和FS寄存器中,需要在程序中显式赋值 。

段寄存器的赋值 (1)代码段寄存器CS(及IP)的赋值 当连接程序扫描到程序结束伪指令END符号地址时,系统自动将当前代码段基址赋值给CS,同时把END后的符号地址送入IP (2)堆栈寄存器SS(及SP)的填入有以下两种方法: 如果有段被定义为堆栈段,当含有该段的目标程序被装入存储器时,系统自动取该段基址送SS,取段长度送SP

(3)数据段寄存器DS及附加段寄存器的填入 用MOV传送指令填入 填入DS .DATA ;数据段 X DW ?, 4000H, 100 DUP(?) .CODE ASSUME CS:@CODE,DS:@DATA START: MOV AX, @DATA MOV DS, AX ;数据段基址-->DS

ASSUME CS:@CODE,DS:@DATA,SS:@STACK START: MOV AX, @DATA MOV DS, AX 简化段定义结构 .MODEL SMALL .STACK 100H .DATA …… .CODE ASSUME CS:@CODE,DS:@DATA,SS:@STACK START: MOV AX, @DATA MOV DS, AX MOV AH, 4CH INT 21H END START 本页不讲,学生自习

3.3 系统功能调用与人机界面设计 1)中断指令 中断指令(INT与IRET) 属于控制转移类指令,可以执行软件中断和DOS系统功能调用

指令 格式 操 作 中断 INT N SP<--(SP)-2 ((SP)+1,(SP))<--(FLAGS) SP<--(SP)-2 ((SP)+1,(SP))<--(CS) ((SP)+1,(SP))<--(IP) IP<--(0000:OA) ;OA=4*N CS<--(0000:OA+2) 中断返回 IRET IP<--((SP)+1,(SP)) SP<--(SP)+2 CS<--((SP)+1,(SP)) FLAGS<--((SP)+1,(SP))

常用的软件中断 中断号 功 能 10H 视频服务中断 13H 软硬盘控制中断 14H 串行口中断 15H 各种IO设备中断 16H 键盘中断 功 能 10H 视频服务中断 13H 软硬盘控制中断 14H 串行口中断 15H 各种IO设备中断 16H 键盘中断 17H 并行打印口中断 20H 返回DOS 21H DOS系统功能调用 23H Ctrl+Break处理 24H DOS严重错误 33H 鼠标中断 2FH 31H DOS保护方式接口 BIOS、DOS、自由中断的汇编调用方式: INT n ; n为中断向量号,如 INT 10H、INT 21H

0AH 输入字符串 (AH)= 0AH (DS:DX)所指 (DS:DX)=输入缓 缓冲区中为 冲区首址 输入的字符串 常用的DOS系统功能调用(INT 21H) 子功能号 功能 入口参数 出口参数 01H 键盘输入 (AH)=1 (AL)=输入字符 02H 显示器输出 (AH)=2 无 (DL)=欲输出字符 09H 显示字符串 (AH)=9 无 (DS:DX)=字符串首址 字符串以‘$’结束 0AH 输入字符串 (AH)= 0AH (DS:DX)所指 (DS:DX)=输入缓 缓冲区中为 冲区首址 输入的字符串 4CH 返回调用 (AH)=4CH 无 进程

软中断调用的基本方法如下: 1、子功能号送AH寄存器; 2、按要求设置所有入口参数; 3、发送 INT n 软中断指令。 BIOS中断调用示例 设置屏幕显示方式为640×480 16色图形方式 MOV AH, 0 ; 子功能号 MOV AL, 12H ; 调用参数 INT 10H ; BIOS 的视频服务中断

BIOS中断调用示例 欲打印字符‘S’,相应的系统调用如下: MOV AH,1 ;初始化打印机子功能号 MOV DX,0 ;打印机号 INT 17H ;初始化打印机 MOV AH, 0 ;打印机子功能号 MOV DX, 0 ;打印机号 MOV AL, 'S' ;欲打印的字符 INT 17H ;打印‘S’

单个字符输入与输出示例 INT 21H ;DOS功能调用 MOV DL, AL ; 要输出的字符 MOV AH, 02H 读入一个字符,并在屏幕上输出 MOV AH, 01H ;输入字符 INT 21H ;DOS功能调用 MOV DL, AL ; 要输出的字符 MOV AH, 02H INT 21H ; DOS功能调用

要想输出回车换行(C语言里的\r\n),可以定义字符串如下: 小贴士: 要想输出回车换行(C语言里的\r\n),可以定义字符串如下: CR DB 0AH,0DH,'$' 字符串输出示例 .DATA MSG DB ‘Hello world!’,’$’ .CODE START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET MSG MOV AH,09H INT 21H MOV AH, 4CH END START 小贴士不讲

STRING DB N DUP(?) ;N个字符空间 …… MOV AH, 0AH 字符串输入示例 该子功能调用前,在数据段中必须定义一个缓冲区: N EQU 20 MAXLEN DB N ;缓冲区最大长度 ACTLEN DB ? ;缓冲区实际字符个数 STRING DB N DUP(?) ;N个字符空间 …… MOV AH, 0AH MOV DX, OFFSET MAXLEN; 缓冲区首地址给DX INT 21H 说明: 1)缓冲区可接受的字符个数为1~255 2)缓冲区的第3个字节开始存放输入的字符,前2个字节位置分别放缓冲区长度和字符串实际字符数