教师:王晓甜 xtwang@mail.xidian.edu.cn 8086CPU 指令系统 教师:王晓甜 xtwang@mail.xidian.edu.cn
提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的六类指令 5. 总结
沟通与交流,让别人领会你的意图,知道该为你做什么事的工具 1. 汇编语言基本概念 什么是 语言 ? 沟通与交流,让别人领会你的意图,知道该为你做什么事的工具 各国语言 有时需要翻译 机器语言 有时需要翻译
1. 汇编语言基本概念 什么是 机器语言 ? 人向机器发送号令,让机器能读懂的语言 机器能读懂什么语言 ? 1. 汇编语言基本概念 什么是 机器语言 ? 人向机器发送号令,让机器能读懂的语言 机器能读懂什么语言 ? 01011101100010100……. 例如: 10110000B 00010010B ; 告诉CPU将AL 12H。
汇编语言 机器语言程序 优点:程序送入计算机后,CPU可以直接执行。 缺点:不易书写,不易检查,编写程序十分困难。 10110000B 采用机器语言编写的程序,即二进制代码程序。 优点:程序送入计算机后,CPU可以直接执行。 缺点:不易书写,不易检查,编写程序十分困难。 汇编语言 10110000B 00010010B 采用一组字母、数字和符号来代替一条二进制代码指令,这种表示指令的符号称为助记符,这种用一组符号来代替一条指令编写程序时采用的语言,称为汇编语言。 MOV AL, 12H
对使用者来说,学习接近机器语言的汇编 ,需要掌握和熟知的方面更多,但更能把握整个程序的全部进程 1. 汇编语言基本概念 汇编语言与机器语言属于低级语言,它们与高级语言有较大的区别,汇编语言中的语句与机器的型号密切相关 。 在高级语言中,完成某个加法功能,我们可采用语句 X=A+B ,只要给变量A和B赋一确定值,此加法就可以实现了。在汇编语言中则不同,程序必须指出A、B存放在何处,相加后的结果又存放在何处。 高级语言告诉机器做什么,汇编语言告诉机器怎么做! 对使用者来说,学习接近机器语言的汇编 ,需要掌握和熟知的方面更多,但更能把握整个程序的全部进程
汇编 1. 汇编语言基本概念 优点:要比一串二进制代码清晰多了,书写 容易,记忆也方便。 缺点:CPU不能直接执行。用汇编语言编写的 1. 汇编语言基本概念 优点:要比一串二进制代码清晰多了,书写 容易,记忆也方便。 缺点:CPU不能直接执行。用汇编语言编写的 汇编语言源程序必须经过汇编,将其翻 译成机器语言格式, CPU才能执行。 汇编 翻译官:把助记符翻译成机器语言 把汇编语言源程序翻译成机器语言程序的过程称为汇编。
汇编 汇编程序 1. 汇编语言基本概念 把汇编语言源程序翻译成机器语言程序的过程称为汇编。 1. 汇编语言基本概念 把汇编语言源程序翻译成机器语言程序的过程称为汇编。 汇编 汇编程序 能把汇编语言源程序翻译成机器语言程序的系统程序(语言加工程序)。8086宏汇编程序为MASM.EXE。
1. 汇编语言基本概念 如: 汇编 05 02 00 反汇编 汇编程序为MASM.EXE 在DEBUG.EXE下进行 机器语言程序 源程序 1. 汇编语言基本概念 如: 汇编程序为MASM.EXE 机器语言程序 源程序 MOV AL , 12H B0 12 汇编 ADD AX , 0002H 05 02 00 反汇编 在DEBUG.EXE下进行
1. 汇编语言基本概念 7.从汇编语言源程序到可执行程序所经过的处理过程 用全屏幕编辑软件编辑汇 编语言源程序 文件名.ASM 1. 汇编语言基本概念 7.从汇编语言源程序到可执行程序所经过的处理过程 用全屏幕编辑软件编辑汇 编语言源程序 文件名.ASM 用连接程序LINK.EXE对 文件名.OBJ 进行连接 用汇编程序MASM.EXE对源程序 文件名.ASM 进行汇编 有错误吗? 有 有 没 有语法错误吗? 在磁盘上形成了可执行文件 文件名.EXE 没 在磁盘上形成目标程序文件 文件名.OBJ
2. 汇编语言指令分类 汇编语言程序中语句的种类 在汇编语言程序设计中,程序中的语句有 指令语句 伪指令语句 宏指令语句
2.汇编语言指令分类 1.指令语句 汇编后能产生机器语言代码,是CPU能执行的语句。 功能性语句
2.伪指令语句 2.汇编语言指令分类 码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 引导性语句 汇编后不能产生机器语言代 码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 引导性语句
2.汇编语言指令分类 3.宏指令语句 它是8086指令系统中没有的指令,是用户自己根据宏指令定义的方法定义的一条能完成某一特定功能的新的指令。 自定义语句
2.汇编语言指令分类 三.汇编语言中语句的组成 汇编语言源程序是由一条条语句 标识符 组成的。语句则由 四部分组成。 操作助记符 操作数 组成的。语句则由 四部分组成。 标识符 操作助记符 操作数 注释 其基本格式如下:
2.汇编语言指令分类
2.汇编语言指令分类 指令: 控制计算机完成某种操作的命令 指令系统: 处理器所能识别的所有指令的集合 指令中应包含的信息: 指令的兼容性: 同一系列机的指令都是兼容的。 指令中应包含的信息: 运算数据的来源 运算结果的去向 执行的操作
2.汇编语言指令分类 指令格式 操作码 [操作数],[操作数] 目标操作数 源操作数 执行何种操作 参加操作的数据 或数据存放的地址
指令格式 2.汇编语言指令分类 操作码 操作数 CLI 将PSW中的IF 清零 PUSH AX 将寄存器AX中的内容入栈 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 CLI 将PSW中的IF 清零 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数 PUSH AX 将寄存器AX中的内容入栈 MOV AL,10H 将10H赋值给AL
指令格式 指令中的操作数: 可以是一个具体的数值(立即数) 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址 分号 空格 逗号 2.汇编语言指令分类 指令格式 MOV AL,10H 操作码 操作数1,操作数2 ;注释 指令中的操作数: 可以是一个具体的数值(立即数) 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址 MOV AL, 80H ;将十六进制数80H送入AL 源操作数:80H;目的操作数:80H INC CX;将CX的内容加一,再放回CX 源操作数:(CX);目的操作数: (CX)-1 CLD;将标志寄存器DF标志位清零 源操作数:DF标志位原来的数据;目的操作数:0 分号 空格 逗号 目的作数(DST) 源操作数(SRC) 目的操作数不仅知名被操作对象, 还默认为是存放操作结果的地方
指令格式 语句名 2.汇编语言指令分类 标识符: 一条语句或是一段存储空间的名字,没有特殊的意义,都是用户在编程的时候自定义开发的 L1 : MOV AX, CX . JUMP L1 语句名,在循环、跳转时常用 JUMP L1 LOOP L1 语句名
指令格式 2.汇编语言指令分类 标识符: 一条语句或是一段存储空间的名字,没有特殊的意义,都是用户在编程的时候自定义开发的 DATA DB 20H, 30H, 11H, 0AH 20H 在数据段定义了一段数据空间,起始地址位 DATA,这段空间有4个字节的单元长度 DATA MOV AL, DATA 30H DATA+1 MOV AL, DATA+2 11H DATA+2 代表地址 0AH DATA+3
指令中的操作数 2.汇编语言指令分类 MOV AL,10H ADD DH,DATA 表征参加操作的数据本身 立即数 寄存器 存储器 表征数据存放的地址 MOV AL,10H ADD DH,DATA 寄存器寻址 立即数寻址 寄存器寻址 存储器寻址
2.汇编语言指令分类 操作数安排注意事项 立即数不能做目的,也就是不能出现在第一个操作数的位置 寄存器与寄存器,存储单元与存储单元,寄存器与存储单元之间可以相互操作和传送数据,但一定要注意单元长度与寄存器长度之间的匹配
Little quiz:判断下列语句对错,若对,指出各个操作数的寻址方式,以及指令操作的结果 2.汇编语言指令分类 Little quiz:判断下列语句对错,若对,指出各个操作数的寻址方式,以及指令操作的结果 MOV BX,AX ADD BX,AX MOV BX,1034H ADD BX,DATA+1 MOV 10H,AL ADD BX,45H MOV BX,AL ADD 45H,BX MOV DATA,DATA+1 存储器之间不能直接传送 ADD DATA,DATA+1
2.字符串常数 3.表达式 1.数值常数 2.汇编语言指令分类 四.汇编语言中的常数与表达式 在汇编语言程序中,语句中的操作数项既可以是常数或表达式(立即数),也可以是指明操作数所在处的一种说明。如果操作数是常数或表达式,则有以下几种形式。 2.字符串常数 3.表达式 1.数值常数 二进制数 十进制数 八进制数 十六进制数 字符串常数是由单引号“ ′…… ′”括起来的一串字符或者单个字符。 语句中的操作数项也可以是表达式。表达式由操作数和操作符组成。
1.数值常数(立即数) 若为数值常数,则按其基数的不同,可 2.汇编语言指令分类 二进制数 十进制数 八进制数 十六进制数 MOV AL , 00001100B MOV AL , 12 MOV AL , 14Q MOV AL , 0CH
2.字符串常数 2.汇编语言指令分类 字符串常数是由单引号“ ′…… ′”括起 来的一串字符或者单个字符。 ;变BUF以下连续的(4个字 如:MOV DL , ′A ′ ; DL 41H BUF DB ′12Aa ′;将′12Aa′字符串定义给 ;变BUF以下连续的(4个字 ;节)存储器单元。
3.表达式 2.汇编语言指令分类 算术操作符:+、-、*、/、MOD 逻辑操作符:ADD、OR、XOR、NOT 表达式由操作数和操作符组成。操作符有: 算术操作符:+、-、*、/、MOD 逻辑操作符:ADD、OR、XOR、NOT 关系操作符:EQ(相等)、NE(不等)、LT(小于)、 GT(大于)、LE(小于或等于)、GE(大于或等于) 属性操作符:SEG、OFFSET、TYPE、LENGTH、SIZE 属性修改操作符:PTR
2.汇编语言指令分类 ①算术操作符 MOV AL , 5+2*3 ; 等效于 MOV AL , 11 MOV AL , 11/2 ; 等效于 MOV AL , 05H;取商 MOV AL , 11MOD 2 ; 等效于MOV AL , 01H;取余 汇编时运算 出结果
2.汇编语言指令分类 表达式是 立即数寻址 ②逻辑操作符 AND AL , 0CCH OR 0F0H AND AL , 0FCH MOV AL , 0CCH AND 0F0H MOV AL , 0C0H 等效于 AND AL , 0CCH OR 0F0H AND AL , 0FCH 等效于 CPU执行时完成的操作 汇编程序汇编时完成的操作
2.汇编语言指令分类 若关系成立,则为真,取值全1; 若关系不成立,则为假,取值全0。 MOV AL , 0FFH ③关系操作符 如: MOV AL , 04H LT 05H ;关系成立为真 等效于 MOV AL , 0FFH
2.汇编语言指令分类
2.汇编语言指令分类 标号、变量及伪指令 前面已经讲过,在汇编语言程序设计中,为了方便记忆,将直接访问的存储器单元的实际地址符号化,即给要访问存储器单元起一个标识符名,而标识符有标号名、变量名等。
1.标号 标号、变量及伪指令 2.汇编语言指令分类 针对指令语句 ● JMP LAB1 LAB1: MOV AX ,0 用以指示某条指令语句的地址。其定义方法就是在指令语 句的操作助记符前加上标号名,以冒号结尾。它可以作为程序转移指令的操作数。
2.汇编语言指令分类
2.变量 2.汇编语言指令分类 针对存储器 DATA DB 20H, 30H, 11H, 0AH 用以指示存放数据的存储器单元的符号地址。 MOV AL, DATA 30H DATA+1 MOV AL, DATA+2 11H DATA+2 0AH DATA+3 DATA DB 20H, 30H, 11H, 0AH
2.变量定义伪指令 2.汇编语言指令分类 DATA DB 20H, 30H, 11H, 0AH 变量的定义是通过伪指令定义的 伪指令:汇编后不能产生机器语言代码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 1001:1002H 0AH 1001:1003H 伪指令的功能是在变量名所对应的地址开始的内存依次放入表达式中的各项值 对编程带来巨大困难 起名字带替
2.汇编语言指令分类 DATA DB 20H, 30H, 11H, 0AH 变量名 决定变量数据类型的关键字: 标识符 DB(字节) 1 DW(字)2 DD(双字)4 DQ(长字)8 DT(十字)10 变量名 后面不能加冒号 变量中按顺序存储的数据
变量定义伪指令主要应用在数据段,是用来给变量名所对应的存储器单元分配数据或预留空间。变量定义伪指令有以下五种: 2.汇编语言指令分类 [变量名] DB 表达式 ;定义字节型变量 变量定义伪指令主要应用在数据段,是用来给变量名所对应的存储器单元分配数据或预留空间。变量定义伪指令有以下五种: [变量名] DW 表达式 ;定义字型变量 [变量名] DD 表达式 ;定义双字型变量 [变量名] DQ 表达式 ;定义长字型变量 [变量名] DT 表达式 ;定义一个10字节的变量
思考: 2.汇编语言指令分类 低地址放低字节,高地址放高字节 DATA DB 20H, 30H, 11H, 0AH DATA1 DW 20H, 30H, 11H, 0AH 画出存储单元中,两个变量的存储形式 低地址放低字节,高地址放高字节 20H 30H 11H 0AH DATA 00H DATA1 DATA+1 DATA1+1
2.汇编语言指令分类 ●1个或多个常数或表达式。当为多个时,其间用逗号分割。 DATA DB 20H, 30H, 11H, 0AH 变量定义伪指令语句中的表达式有以下几种情况: ●1个或多个常数或表达式。当为多个时,其间用逗号分割。 DATA DB 20H, 30H, 11H, 0AH ●带引号的字符串。 DATA1 DB ‘0123’ DATA2 DW ‘AB’, ‘C’, ‘D’ ●一个问号(?)。(用来将此单元保留,存放结果) DATA3 DW ? 一个字的 预留单位,内容未知 ●重复方式。其格式为: 重复次数 DUP (表达式) DATA4 DB 3 DUP(?) 3个字节的 预留单位,内容未知
2.汇编语言指令分类 关于字符串 若字符串定义为 DB 字节变量时 整个字符串可以在同一个引号内给出 每个字节内存入一个字符的ASCII 码 DATA1 DB ‘0123’ 若字符串定义为 DB 字节变量时 整个字符串可以在同一个引号内给出 每个字节内存入一个字符的ASCII 码 1500H:0000H ‘0’ DATA1 30H 1500H:0001H ‘1’ 31H ‘2’ 32H ‘3’ 33H
2.汇编语言指令分类 关于字符串 若字符串定义为 DW 字节变量时 DATA1 DW ‘AB’, ‘C’, ‘D’ 每个数据不能超过两个字符 若为两个字符,则高位放高字节,低位放低字节 若为一个字符,则该字符的ASCII码放在低字节,高字节为00H ‘B’ DATA1 1500H:0000H 42H 1500H:0001H ‘A’ 41H 1500H:0002H ‘C’ 32H 00H 00H ‘D’ 33H 00H 00H
变量定义举例 2.汇编语言指令分类 若(DS)=1500H,且在数据段0000H偏移地址开始有以下变量定义。 1500H:0000H DAT1 DB 12,-12,12H DAT2 DB 2*3,3+2 DAT3 DW 02H,567AH DAT4 DD 89H DAT5 DB ′THIS′ DAT6 DW ′AB′, ′C′ DAT7 DB 3 DUP (00H) DAT8 DW 3 DUP (?) DAT9 DW DAT6 DAT10 DD DAT8 DAT11 DB ?
2.汇编语言指令分类 DAT1 DB 12,-12,12H DAT2 DB 2*3,3+2 OCH DAT3 DW 02H,567AH 1500H:0000H OCH DAT1 DAT3 DW 02H,567AH OF4H 12H 0003H 06H DAT2 05H 0005H 02H DAT3 00H 7AH 56H
2.汇编语言指令分类 89H 00H 00H 00H `T` `H` `I` `S` 1500H:0009H DAT4 DAT4 DD 89H 00H DAT5 DB ′THIS′ 00H 000DH `T` DAT5 `H` `I` `S`
2.汇编语言指令分类 ‘B’ ‘A’ ‘C’ 00H ‘D’ 00H 1500H:0011H DAT6 DAT6 DW ′AB′, ′C′,’D’ ‘D’ 00H
2.汇编语言指令分类 00H DAT7 DB 3 DUP (00H) 00H DAT8 DW 3 DUP (?) 00H ? ? ? ? ? 001AH ? DAT8 ? ? ? ? ?
2.汇编语言指令分类 11H DAT9 DW DAT6 00H DAT10 DD DAT8 1AH DAT11 DB ? 00H 00H 变量地址 15H 0026H ? DAT11
2.汇编语言指令分类 变量的属性 一个变量一但定义了,就具有了一下五个属性: 段地址(SEG) 段内偏移地址(OFFSET) 类型(TYPE) 长度(LENGTH) 大小(SIZE) 变量所在段的段地址 为变量对应单元的偏移地址 为每个变量所占的字节数 第一个DUP前的系数,表示变量重复的次数 变量所占用的所有字节数,它等于变量的长度与类型(字节数)之积 。 SIZE=LENGTH×TYPE
2.汇编语言指令分类 变量属性分析举例 SEG OFFSET TYPE LENGTH SIZE DAT1 DB 12,-12,12H ● 0005H 2 1 2 DAT3 DW 02H,567AH DAT4 DD 89H 0009H 4 1 4 DAT5 DB ′THIS′ 000DH 1 1 1 DAT6 DW ′AB′, ′C′ 0011H 2 1 2 DAT7 DB 3 DUP (00H) 0017H 1 3 3 DAT8 DW 3 DUP (?) 001AH 2 3 6 DAT9 DW DAT6 0020H 2 1 2 0022H 4 1 4 DAT10 DD DAT8 0026H 1 1 1 DAT11 DB ?
例:对于前面变量定义例子中各变量的定义, 我们有: 2.汇编语言指令分类 例:对于前面变量定义例子中各变量的定义, 我们有: DAT3 DW 02H,567AH MOV AX , SEG DAT1 ; (AX)=1500H MOV AX , SEG DAT10 ; (AX)=1500H MOV AX , OFFSET DAT3 ; (AX)=0005H MOV AL , TYPE DAT3 ; (AL)=02H MOV AH , SIZE DAT3 ; (AH)=02H 以上指令中, SRC均为立即数寻址
2.汇编语言指令分类 属性修改操作符 PTR:可以暂时改变已经定义过的变量或者标量的类型。 使用格式: 类型 PTR 表达式 类型:变量的类型BYTE/WORD/DWORD 标号的类型:NEAR(进程)/FAR(远程) MOV DB PTR DATA3, AL DAT3 DW 02H,567AH
2.汇编语言指令分类 2.变量定义及伪指令 用户编写程序指令 STACK SEGMENT STACK ‘STACK’ DW 100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGEMNT DATA1 DB 01H, 02H, ‘ABCD’ DATA2 …… DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, ES:DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV SS, AX LEA SP, TOP CODE ENDS END START 用户编写程序指令
教师:王晓甜 xtwang@mail.xidian.edu.cn 8086CPU 指令系统 教师:王晓甜 xtwang@mail.xidian.edu.cn
提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的六类指令 5. 总结
3.数据的寻址方式 计算机的指令包含操作码和操作数,操作码指明指令的操作性质,操作数指明操作的对象。 例: MOV AX,BX 操作码 操作数 由于编程上的需要,指令中通常并不直接给出操作数,而是给出存放操作数的地址;有时操作数的存放地址也不直接给出,而是给出计算操作数地址的方法。我们称这种指令中如何提供操作数或操作数地址的方式为寻址方式
3.数据的寻址方式 寻址方式就是指令中确定操作数的在哪里的方法 8086CPU指令系统的寻址方式分为两类: 数据的寻址方式:寻找指令操作所需数据的方法; 转移地址的寻址方式:寻找转移指令所需的程序地址。 寻址方式就是指令中确定操作数的在哪里的方法
3.数据的寻址方式 数据的寻址方式就是告诉CPU存/取数据的地方。 数据的寻址方式(共8种): 立即数寻址(Immediate Addressing ) 寄存器寻址(Register Addressing ) 存储器寻址(Memory Addressing )(5种): 直接寻址、寄存器间接寻址、寄存器相对寻址、 基址变址寻址、基址变址且相对寻址 隐含寻址(Hidden Addressing )
一、立即数寻址 3.数据的寻址方式 指令中的源操作数是立即数,即源操作数是参加操作的数据本身 例:MOV AX,1200H Immediate Addressing 指令中的源操作数是立即数,即源操作数是参加操作的数据本身 例:MOV AX,1200H 立即寻址主要用来给REG或M赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。 如:MOV 12H , AL (语法错误) MOV 00H 代码段 12H ┇ AH AL
使用寄存器寻址一定要注意数据长短匹配一致, 3.数据的寻址方式 二、寄存器寻址 Register Addressing 参加操作的操作数在CPU的通用寄存器中。 例:MOV AX,BX AX BX 使用寄存器寻址一定要注意数据长短匹配一致, 即数据类型保持一致 CS 不能作为目的操作数
3.数据址的寻址方式 叁、存储器寻址 3.1 直接寻址 这类寻址方式,操作数在存储器中,而存储器单元的地址由以下五种寻址方式的任何一种均可以找到。但在指令中给出的只是要寻找的操作数所在单元的段内偏移地址,而操作数所在单元的段地址除非指令中用段前缀特别指明,否则是默认的DS。
叁、存储器寻址 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) 例1:MOV AX, [1200H] 指令中直接给出了要寻找操作数所在单元的16位偏移地址。 直接寻址方式下,操作数的段地址默认为数据段 例1:MOV AX, [1200H] 若DS为3000H,则: 结果: AX: 1122H
叁、存储器寻址 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) 若 ES= 1500H, 直接寻址方式下,操作数的段地址默认为数据段,但允许段重设,即由指令定义段。 例:MOV AX,ES:[1200H] 若 ES= 1500H, 则向AX传送的数据来自存储器 1500H:1200H = 1500H * 16 + 1200H = 15000H + 1200H = 16200H
3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) 例:MOV AX,ES:[1200H] 需要人自己记忆, 复杂,困难,应用不便 所以在实际的汇编语言程序设计中,常常采用给存放数据的单元,定义一个符号地址名,即变量名/变量。 这样,在程序设计中就可以用这个变量名代替原来的存储器单元的实际地址。
…… + 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) DS 1 5 0 0 0 H 0 0 0 4 H 例4:若(DS)=1500H,TABLE为在DS段定义的一个字变量,且偏移地址为0004H。则CPU执行 MOV AX ,TABLE 指令完成的操作如下: DS 1 5 0 0 0 H + 0 0 0 4 H PA=1 5 0 0 4 H …… A H A L 15004H TABLE 数据段 15005H 存储器
3.数据的寻址方式 例5:若VAR1为字变量, VAR2和VAR3为字节变量,判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因。 MOV AX , VAR1 √ SRC为直接寻址 DST为寄存器寻址 MOV AX , VAR2 ╳ 类型不一致 MOV VAR2, VAR3 ╳ 两存储器单元之间不 能直接传送数据 MOV [0200H] ,12H ╳ 类型不明确
3.数据的寻址方式 例6:将例5中语法不正确的语句改对。 MOV AX , VAR2 ╳ 类型不一致 改:MOV AL , VAR2 MOV VAR2, VAR3 ╳ 两存储器单元之间不 改: MOV AL ,VAR3 能直接传送数据 MOV VAR2 ,AL MOV [0200H] ,12H ╳ 类型不明确 改:MOV BYTE PTR [0200H] ,12H 或者:MOV WORD PTR [0200H] ,12H 注:PTR为临时属性修改符。
叁、存储器寻址 EA= 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing 这种寻址方式,要寻找的操作数在某存储器单元中,该存储器单元地址的段内16位偏移地址在指令中以BX、SI、DI、BP某一个寄存器给出。其段地址默认在DS段。 BX 默认在数据段 SI 只能用这几个寄存器 否则会无法通过编译 EA= DI 默认在堆栈段 BP
叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing 例1:MOV AX , [BX] 其SRC为寄存器间接寻址; DST为寄存器寻址; 指令完成的功能为:AX (DS:(BX)) 若:DS=3000H , BX=1050H 则:SRC所在单元的物理地址为: PA=(DS) × 16+(BX) =30000H+1050H =31050H
叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing 例2:MOV ES:[SI] , AL 指令完成的功能为: (ES:(SI)) (AL) 若:ES=4000H , SI=1234H,(AL)=23H 则:DST所在单元的物理地址为: PA=(ES)×16+(SI) =40000H+1234H =41234H ∴指令执行后(41234H)=23H.
叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing 例3:判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因,并改正。 ① MOV [BX], [SI] ╳ 两存储器单元之间不 能直接传送数据;类型也 不明确。 改正:MOV AL , [SI] MOV [BX] , AL
3.数据的寻址方式 DST为寄存器间接寻址 ② MOV [DI] ,12H ╳ 类型不明确 改正:MOV WORD PTR [DI] , 12H ③ MOV [SI] ,CX √ DST为寄存器间接寻址 SRC为寄存器寻址
叁、存储器寻址 + EA= + 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing BX MOV AX , [BX] + 05H 寄存器内的地址 相对位移量 DISP + BP SI BX DI 8位DISP 16位DISP EA= +
EA= + 3.数据的寻址方式 BX 8位DISP BP SI 16位DISP DI 在DISP为常数时,操作数所在单元的段地址以寄存器为准,若寄存器为BX、SI、DI,操作数默认在DS段中。若寄存器为BP,操作数默认在SS段中。 在DISP为变量时,操作数所在单元的段地址以变量为准,变量在哪个段定义的,就取该段的段地址。 MOV AX ,TABLE [BP] (AX) (DS: OFFSET TABLE+(BP))
叁、存储器寻址 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing [BX+05H] 例1:MOV AX , [BX]+05H 其中,SRC也可以写成: 若:DS=2000H , BX=0008H, 存放操作 数单元的物理地址为: [BX+05H] 05H[BX] 05H+[BX] PA=(DS)×16+(BX)+05H =20000H+0008H+05H =2000DH
叁、存储器寻址 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing 例1:MOV AX , [BP],若DS=1050H , BP=0050H, 存放操作数的存储单元的物理地址为: ╳ PA=(SS)×16+(BP)+00H =10500H+0050H+00H =10550H 例2:若(DS)=1500H, TABLE为在DS段定义的一个字变量,且偏移地址为0004H,(BP)=0003H。 MOV AX ,TABLE [BP] 指令完成的操作为:(AX) (DS: OFFSET TABLE+(BP)) 例3:若题目如上,执行指令 MOV AX, TABLE[BP-2] 指令完成的操作为:(AX) (DS: OFFSET TABLE+(BP)-2)
叁、存储器寻址 EA= + 3.数据的寻址方式 3.4基址变址寻址Based Indexed Addressing 要寻找的操作数在某存储器单元之中,该单元 有效地址的一部分在 中,另一部分在 中。 BP BX SI DI EA= + BP BX SI DI MOV AX , [BX][SI] MOV AX , [BP][SI] 该单元的段地址以基址寄存器为准,若基址寄存器为BX,则段地址默认在DS中,若基址寄存器为BP,则段地址默认在SS中。
叁、存储器寻址 3.数据的寻址方式 3.4基址变址寻址Based Indexed Addressing 例1:MOV AX , [BX][SI] (AX) (DS:(BX+SI)) 例2:MOV AX , [BP][SI] (AX) (SS:(BP+SI)) 例3:MOV [BP][DI] , AL (SS:(BP+DI)) (AL) 假设:BX=0000H, SI=0005H BP=0003H, DI=0005H DS:0003H 01H SS:0003H 11H DS:0004H 23H 31H SS:0004H DS:0005H 76H 65H SS:0005H DS:0006H 0AAH 0FFH SS:0006H 55H DS:0007H 00H SS:0007H DS:0008H ‘A’ 77H SS:0008H DS:0009H ‘B’ SS:0009H 81H DS:000AH ‘C’ SS:000AH 97H
叁、存储器寻址 EA= + 3.数据的寻址方式 3.5基址变址且相对寻址 Based Indexed Relative Addressing 它是基址变址寻址的扩充,操作数仍在存储器中,存储器单元的有效地址为: BP BX EA= 8位DISP 16位DISP + SI DI MOV AX , [BX][DI]04 MOV DS:[BP][DI]+04H , AL 同样,如果用BX作为基地址,操作数默认在DS段中;如果用BP作为基地址,则在SS段中。 在DISP为变量时,操作数所在单元的段地址以变量为准,变量在哪个段定义的,就取该段的段地址。
叁、存储器寻址 3.数据的寻址方式 3.5基址变址且相对寻址 Based Indexed Relative Addressing 例1: MOV AX , [BX][DI]04 (AX) (DS:(BX+DI+04H)) 例2:MOV AX , [BP][DI]04 (AX) (SS:(BX+DI+04H)) 例3:MOV DS:[BP][DI]+04H , AL (DS:(BX+DI+04H)) (AL) 假设:BX=0000H, SI=0005H BP=0003H, DI=0002H DS:0003H 01H SS:0003H 11H DS:0004H 23H 31H SS:0004H DS:0005H 76H 65H SS:0005H DS:0006H 0AAH 0FFH SS:0006H 55H DS:0007H 00H SS:0007H DS:0008H ‘A’ 77H SS:0008H DS:0009H ‘B’ SS:0009H 81H DS:000AH ‘C’ SS:000AH 97H
四、隐含寻址 Hidden Addressing 3.数据的寻址方式 四、隐含寻址 Hidden Addressing 有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含的指明了操作数地址。 如:乘除法指令、字符串操作类指令等。 例: MUL BL 指令的执行:AL×BL AX 例: CLI 指令的执行:将IF 清零
3.数据的寻址方式 例2:判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因。 MOV AX, [BX][SI] √ SRC为基址变址寻址 DST为寄存器寻址 MOV AX, BL ╳ 类型不一致 MOV [BP], [DI+01H] ╳ 两存储器单元之间 不能直接传送数据 MOV [BX][DI]+02H ,12H ╳ 类型不明确
具体下一条执行哪条指令是由CS:IP决定,则我们可以通过改变CS:IP的内容实现程序指令的跳转 3. 转移地址的寻址方式 前面讲的是各种数据的寻址方式, 实际上,每一条程序指令存储在存储器的某一存储单元空间中(代码段), 也需要寻址 指令是按照编程的书写,顺序存放在代码段 程序的执行顺序由 CS:IP 决定。 CPU执行一条指令,IP 内容自动增1、 使之指向下一条指令 当前执行指令 下一条指令 CS :IP IP常被称为指令指针REG 具体下一条执行哪条指令是由CS:IP决定,则我们可以通过改变CS:IP的内容实现程序指令的跳转 转移地址的寻址
3. 转移地址的寻址方式 寻找的操作数指定的地址,赋给IP或CS:IP, 从而实现程序的转移。 如果程序转移后只有IP发生了改变,则称 为段内转移或者称为近程转移(也称为NEAR 型转移)。 如果程序转移后CS、IP均发生了改变,则 称为段间转移或者称为远程转移(也称为FAR
3. 转移地址的寻址方式 先介绍无条件转移指令JMP : JMP OPR 程序转移到由OPR指定的位置执行。 8086指令系统中的转移指令有两大类: 无条件转移指令:有JMP、CALL、RET、IRET 条件转移指令:如JZ、JC、JCXZ、LOOP等。 先介绍无条件转移指令JMP : JMP OPR 程序转移到由OPR指定的位置执行。
3. 转移地址的寻址方式 转移地址的寻址方式有下列4种: 段内寻址表示转移在本段内完成,段间寻址表示转移 在不同段之间完成。
段内转移地址的寻址方式(只有IP发生改变) 3. 转移地址的寻址方式 段内转移地址的寻址方式(只有IP发生改变) 1.段内直接寻址 (Direct addressing within same segment) (也叫段内相对寻址) 段内直接寻址是指直接在指令中给出转移目的地址(16位偏移地址),转移在同一个段内完成。指令中用JMP <标号>表示,当然这里的标号与该指令处在同一个段。例如: JMP LABEL ;程序转移到标号LABEL处执行
3. 转移地址的寻址方式 -32768 16位DISP L1: ● 操作码 +32767 转移目的地的IP=当前(IP)+16位DISP XXH ??H ??H JMP L1 ;JMP NEAR PTR L1 当前IP 操作码 间隔的字节数称为相对 位移量DISP +32767 转移目的地的IP=当前(IP)+16位DISP
2.段内间接寻址(Indirect addressing within same segment) 3. 转移地址的寻址方式 2.段内间接寻址(Indirect addressing within same segment) 段内间接寻址是指转移目的地址(16位偏移地址)保存在寄存器或存储单元,转移也在同一个段内完成,在指令中指出所使用的寄存器或存储单元的偏移地址,当采用存储单元保存转移地址时,可以采用以上介绍的5种存储器寻址方式。例如: JMP BX ;程序转移的目的地址为BX的内容 JMP VAR1 ;程序转移的目的地址为字型变量 VAR1的内容 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR1
3. 转移地址的寻址方式 例:若(DS)=2000H,(BX)=0100H,(SI)=0002H, (20100H)=1200H,(20102H)=1250H, 则CPU执行: JMP BX 指令后,(IP)=0100H JMP WORD PTR [BX]指令后,(IP)=1200H JMP WORD PTR [BX][SI]指令后,(IP)=1250H
段间转移地址的寻址方式(CS、IP均发生改变) 3. 转移地址的寻址方式 段间转移地址的寻址方式(CS、IP均发生改变) ——只适合于无条件转移指令 1. 段间直接寻址Direct addressing between different segments 段间直接寻址是指直接在指令中给出转移目的地址(16位偏移地址和16位段地址),转移在不同段之间完成。指令中用JMP <标号>表示,当然这里的标号与该指令处在不同的段。例如: JMP LABEL ;程序转移到标号LABEL处执行 (LABEL 不在本段中)
3. 转移地址的寻址方式 SEG LABEL LABEL:● OFFSET LABEL ????:****H 代码段 XXH **H **H ??H ??H JMP FAR PTR LABEL 1 OFFSET LABEL 操作码 ; ????:****H 代码段 2
2. 段间间接寻址Indirect addressing between different segments 3. 转移地址的寻址方式 2. 段间间接寻址Indirect addressing between different segments 段间间接寻址是指转移目的地址(32位地址)保存在存储单元中,转移在不同的段之间完成,在指令中指出存储单元的偏移地址,可以采用以上介绍的5种存储器寻址方式。存储单元必须是双字型变量,第一个字用于存放目的地址的段内偏移地址,第二个字用于存放目的地址的段地址。例如: JMP VAR3 ;程序转移的目的地址为双字型变量 VAR3的内容 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR3
3. 转移地址的寻址方式 低字节 …… 高字节 存放转移地址的首址 转移OFFSET IP 转移SEG地址 CS 存储器
如 :JMP DWORD PTR [BX][DI] 3. 转移地址的寻址方式 如 :JMP DWORD PTR [BX][DI] … 若(DS)=3000H,(BX)=1000H,(DI)=2000H,则: 33000H 05H 00H IP DS: 3 0 0 0 BX: 1 0 0 0 DI: 2 0 0 0 3 3 0 0 0 H + 20H 00H CS 80H …… CS: 8 0 0 0 IP: 2 0 0 0 8 2 0 0 0 H + 82000H …… 目的地址
3. 转移地址的寻址方式 综上所述,转移地址的4种寻址方式也可以从指令形式加以区分,即:
3. 总结 数据的寻址方式(共8种): 立即寻址(Immediate Addressing ) MOV AL , 20H 寄存器寻址(Register Addressing ) MOV BX, AX 存储器寻址(Memory Addressing )(5种): 直接寻址 MOV AL, [1200H] 寄存器间接寻址 MOV AL, [BX] 寄存器相对寻址 MOV AL, [BX]+03H 基址变址寻址 MOV AL, [BX][SI] 基址变址且相对寻址 MOV AL, [BX][SI]04H 隐含寻址(Hidden Addressing ) STI CLI
3. 转移地址的寻址方式 指令的寻址方式 段内直接寻址 JMP LABEL (LABLE在本段) 段内间接寻址 JMP BX JMP VAR1 JMP VAR1[SI] 段间直接寻址 JMP LABEL (LABLE不在本段) 段间间接寻址 JMP VAR3; VAR3位双字变量 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR3
Thank You ! www.themegallery.com