汇编第三章80x86的指令系统和寻址方式
80X86寻址方式和指令系统
的寻址方式由指令给出。 例如,若(BX)=2000H, (SI)=0A00H, (DI)=2A00H,则以下指令 的结果是一样的:
MOV AL, [2A00H] MOV AL, [BX+0A00H] MOV AL, [BX][SI] MOV AL, [DI]
MOV AX , [2A00H] MOV DX , ES: [2A00H] MOV SI , TABLE_PTR
80X86寻址方式和指令系统
第3章 80X86寻址方式和指令系统
执行指令:A10231 MOV AX,[3102H] 后
AL (3102H) , AH (3103H) 如果(DS)=2000H, (23012H) = CDH, (23013H) = ABH
EA =
(BX) + (SI) + 8位
(BP)
(DI)
16位
例如:
MOV AX,BASE [SI] [BX] MOV AX,[BX+BASE] [SI] MOV AX,[BX+SI+BASE] MOV AX,[BX] BASE [SI] MOV AX,[BX+SI] BASE
“相对的基址变址寻址”方式主要用于对二维数组的访问。
错误例:
× MOV 2A00H, AX ; 错误!
80X86寻址方式和指令系统
第3章 80X86寻址方式和指令系统
例如: B80231 MOV AX,3102H 执行后,(AH) = 31H,(AL) = 02H
立即寻址指令在 存储器中的存放 形式
AX AH AL
存储器
80X86的指令系统和寻址方式
返回
2、寄存器寻址方式
在这种寻址方式中,指令的操作数存放在寄 存器中,该寄存器号作为指令代码的一部分 存放在代码段中。 例 2-2 MOV EAX,EBX
执行前:(EAX)=3366H,(EBX) = 1210H 执行后:(EAX) = 1210H
返回
3、直接寻址
在直接寻址方式中,指令中直接提供源操作数 的偏移地址,它作为指令代码的一部分存放在 代码段中。 例2-3 MOV AX,DS:[00404000h] 执行情况如图2-4所示。执行后:(AX) =0FF20H。
返回
7、相对基址变址寻址方式
在该寻址方式下,有效地址EA等于基址寄 存器BR的值加变址寄存器IR的值加位移量X 的和,即EA = X + [BR] + [IR]。 例 2.1.7 MOVAX,Disp[EBX][EDI] (或写为MOV AX,Disp[EBX+EDI]和 MOV AX,[Disp+EBX+EDI])
返回
8、比例变址寻址方式
在这种寻址方式中,有效地址EA等于位移量 X加上变址寄存器IR的内容与比例因子K乘积 之和,即EA = X + [IR * K]。 例如,有一个元素大小4字节的数组Arr,现 要在EAX寄存器中转载数组中的第2个元素, 可以使用指令MOV EAX,Adrs[ESI*4], 其中(ESI)=2,偏移量Adrs的值等于数组 Arr的基地址。其执行情况如图2.1.6所示。
返回
1、立即数寻址
在这种寻址的方式中,操作数是一个立即数, 对立即数的寻址称为立即寻址。 例 2-1 MOV AX,1234H
执行前:(AX) = 1412H 执行后:(AX) = 1234H,执行过程如图2-3所 示。
80x86寻址方式和指令系统
80x86寻址方式和指令系统第三章 80x86寻址方式和指令系统3.1 80x86 寻址方式3.1.1数据寻址方式通常指令分为操作码和操作数两部分,表示指令中操作数所在的方法称数据寻址方式。
一、立即寻址操作数包含在指令中,作为指令的一部分,存放在代码段中。
操作数(又称立即数)存放形式为,数据高位存放在地址高位存储单元,数据低位存放在地址低位存储单元。
例3.1·MODEL tiny;选择单个段模式地址·586;586实方式CS:EA 机器码·CODE;代码段开始·STARTUP;程序开始1D24:0100 B83412 MOV AX,1234H ;AX←1234H1D24:0103 66BB00000000 MOV EBX,0;EBX←01D24:0109 B155 MOV CL,55H;CL←55H·EXIT;返回DOSEND;文件结束例3.1中指令MOV AX,1234H,其源操作数为立即数1234H,目的操作数为寄存器AX。
存放该指令的地址为1D24:0100,执行该指令,从代码段取出立即数1234H送寄存器AX中。
图3.1为立即寻址过程示意图。
../../../flash/t3.1.swf图3.1 立即寻址过程示意图二、寄存器寻址操作数在寄存器中,操作数可以是8位、16位或32位通用寄存器、16位段寄存器。
例3.2·MODEL TINY·586·CODE地址机器码·STARTUP1D24:0100 8BC3 MOV AX,BX;AX←BX1D24:0102 8ACA MOV CL,DL;CL←DL1D24:0104 668BF7 MOV ESI,EDI;ESI←EDI·EXITEND上例中指令MOV AX,BX,其源操作数为BX,目的操作数为AX。
存放该指令的地址为1D24:0100,执行该指令,将BX内容复制到AX中。
[工学]第三章 80X86的指令系统和寻址方式
值是2000H, 就需要将2000H装入某个段寄存器,如DS,这就是 段更换.
MOV AX,2000H MOV DS,AX MOV BX,0100H MOV AL,[BX] 要寻址的数据在2000H段的0100H单元,而目前CS段寄存的值是 2000H,可在寻址操作数加一段跨越前缀,如CS:,这就是段跨越. MOV BX,0100H MOV AL,CS:[BX]
2)若以BP间接寻址,则操作数在堆栈段中;即物理地 址为:SS*16+BP
3)段地址隐含只有DS,SS.允许段超越如:MOV AX, ES:[SI]
下面的指令不正确: MOV CX, [DX] MOV AL,[BL]
汇编语言程序设计
寄存器相对寻址方式
寄存器相对寻址方式是指操作数的有效地址EA是由一 个基址寄存器或变址寄存器内容和指令中指定的8 位或16位位移量之和.
汇编语言程序设计
寄存器间接寻址举例
例:MOV AX,[BP];等价MOV AX,SS:[BP];假设执 行前SS =3000H, BP =2000H.该指令的执行过程如 图所示.执行后AX=5000H
汇编语言程序设计
需要注意的问题
1)若以SI,DI,BX间接寻址,则操作数在当前数据段中; 即物理地址为:DS*16+SI或DI或BX
需要注意的问题
1、可以用符号地址〔也称为变量)代替数值地址〔偏移地址). 例:在数据段中定义:
X DW 2000H Y DB ‘A’
MOV AX,X MOV AL,Y MOV BX,Y+1 用DEBUG中调试这个程序段时: MOV AX,[000DH] MOV AL,[000FH] MOV BX,[0010H] 值得说明的是:MOV AX,X与 MOV AX,[X]等价 .
第3章80x86的寻址方式与指令系统(自学)
有效地址的计算公式:
EA=基址+(变址×比例因子)+位移量
2020/8/1
汇编语言程序设计
16
3.2 80x86的寻址方式
16/32位寻址时EA四种成分的组成
位移量
0,8,16位 0,8,16,32位
基址寄存器 BX,BP 任何32位通用寄存器
变址寄存器 SI,DI 32位通用寄存器(除ESP)
比例因子
指令的形式有: 双操作数指令 单操作数指令 隐含操作数指令
DEC CX AAA
2020/8/1
汇编语言程序设计
5
3.1 指令系统概述
3. 操作数的种类
(1) 立即数——操作数本身,存放在指令 代码中。 (2) 寄存器操作数——操作数存放在CPU 内部寄存器中。 (3) 内存操作数——操作数存放在内存中, 一般在数据段、附加段、甚至堆栈段。给 出的是操作数的地址。 (4) 端口操作数——在I/O指令中,给出的 端口地址。如
无 1,2,4,8
16位寻址 32位寻址
2020/8/1
汇编语言程序设计
17
3.2 80x86的寻址方式
段 约 定 和 段
在指令中大多隐含 段地址。段地址有个基 本的规定(约定,默 认),也允许超越(可
超 修改),见下表所示:
越
2020/8/1
汇编语言程序设计
18
3.2 80x86的寻址方式
2020/8/1
汇编语言程序设计
11
3.2 80x86的寻址方式
2.寄存器寻址方式(Register addressing) 操作数在寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是AX、BX、 CX、DX、SI、DI、SP、BP;对于8位操作数,寄 存器可以是AH、AL、BH、BL、CH、CL、DH、 DL。对于32位操作数,寄存器可以是EAX、EBX、 ECX、EDX、ESI、EDI、ESP、EBP;
第三章-80X86的寻址方式和指令系统-1
6. 基址加变址寻址方式 (Based indexed addressing)
操作数的有效地址是一个基址寄存器和一个变址寄存器的 内容之和,基址寄存器名和变址寄存器名均有指令指定。 除有段跨越前缀之外,形成物理地址有二种方式:
PA=16d×(DS )+(BX)+
(SI)
(DI)
PA=16d×(SS)+(BP)+
小结:三种类型操作数
综观8086/ 8088寻址方式,其操作数有三种类型:
立即操作数、寄存器操作数、存储器操作数。
三种类型操作数特点:
(1)立即操作数 • 可以使用立即操作数指令有: 数据传送指令、算术运算指令(乘、除运算指令除外)、
逻辑运算指令等。
• 立即数只能作为源操作数,不能作为目标操作数。
存储器
... 32000H ... ... 334EAH 67H 45H ... 数 据 段
基址加变址寻址方式 MOV AX,[BX+SI]
用途:这种寻址方式同样适用于数组或表格处理。
表格首地址基址寄存器中,用变址寄存器来访问 数组中的元素。二个寄存器都能修改,所以比直接 变址方式更灵。
存储器
ARRAY+5
指令执行后:EA=5040H PA=55040H (55040H)=5548H (AX)=5548H
寄存器相对寻址方式 MOV AX,COUNT[BP]
用途:这种寻址方式同样用于表格处理。 表格首地址COUNT 修改基址或变址寄存器来取得表格中的值。 例:某数据表的首地址为COUNT 欲读取表中第10个数据,存放到(AL)中。 第10个数据的有效地址: EA= COUNT + 9 MOV SI , 09H MOV AL , [SI+COUNT]
第三章 汇编语言80X86的指令系统和寻址方式
第3章 80x86指令系统和寻址方式
《汇编语言》
对同一类型指令,执行速度: 寄存器操作数 立即数操作数 存储器操作数
快
慢
例
mov mov mov
AL , BL AL , 0 AL , [ BX ]
快
慢
17
第3章 80x86指令系统和寻址方式
《汇编语言》
3.2
80x86寻址方式
3.2.1 寻址、寻址方式的概念
18
第3章 80x86指令系统和寻址方式
《汇编语言》
3.2.2 80X86的指令格式
指令助记符 [ 操作数1 [ , 操作数2 [ , 操作数3 ] ] ] [;注释]
指令助记符体现该指令的功能,它对应一条二进 制编码的机器指令。 指令的操作数个数由该指令确定,可以没有操作 数,也可以有一个、二个或三个操作数。
指令系统的基本概念
指令系统
计算机的指令系统就是指该计算机能够执行
的全部指令的集合。 每种计算机都有它支持的指
令集合。 16位8086指令系统是整个Intel 80x86 系列微处 理器指令系统的基础。
2
第3章 80x86指令系统和寻址方式
《汇编语言》
3.1.2
指令格式
指令由操作码和操作数两部分组成。
双操作数: 指令中给出两个操作数。
7
第3章 80x86指令系统和寻址方式
《汇编语言》
① 无操作数: 指令只有一个操作码,没有操作数。
有两种可能: ▲ 有些操作不需要操作数。 如 HLT,NOP等处理机控制指令。 ▲ 操作数隐含在指令中。 如 STC , CLC等处理机控制命令。
AAA , DAA等调整指令。
1) 立即寻址方式
第三章 80X86的寻址方式和指令系统
操作码 操作数
操作码和操作数的字节数由具体的指令系统决定。
8086指令编码格式
操作码
对于MOV 指令应注意几个问题:
①存储器传送指令中,不允许对CS和IP进行操作;
②两个操作数中,除立即寻址之外必须有一个为寄存 器寻址方式,即两个存储器操作数之间不允许直接进 行信息传送; 如我们需要把地址(即段内的地址偏移量)为AREAl 的存储单元的内容,传送至同一段内的地址为AREA2 的存储单元中去,MOV指令不能直接完成这样的传送, 但我们可以CPU内部寄存器为桥梁来完成这样的传送: MOV AL,AREAl MOV AREA2,AL
8086指令编码格式操作码三类格式操作码寻址方式操作码寻址方式操作数具体的字节数根据指令的不同有16字节操作码操作码操作码操作码操作码操作码寻址方式寻址方式寻址方式寻址方式寻址方式操作数操作数操作数操作数操作数操作数操作数操作数操作数操作数指令编码举例
第三章 80X86的寻址方式和指令系统
3.1 指令的格式
但是,只要在指令中指定是段超越的,则可以用 别的段寄存器作为地址基准。
4) 比例变址寻址
物理地址=段寄存器:[变址寄存器*比例因子+偏移量]
默认组合:
DS:[SI*比例因子+偏移量]
ES:[DI*比例因子+偏移量]
例:MOV AX,50H[SI]*4
5) 基址加变址寻址 把BX和BP看成是基址寄存器,把SI、DI看着是 变址寄存器,把一个基址寄存器(BX或BP)的内容 加上一个变址寄存器(SI或DI)的内容,再加上指令 中指定的8位或16位偏移量(当然要以一个段寄存器 作为地址基准)作为操作数的偏移地址,如图所示。
汇编语言 第3章1 80x86的指令系统和寻址方式
CS、DS、SS、ES
寄存器寻址指令
MOV AX,1234H MOV BX,AX ;AX←1234H ;BX←AX
寄存器寻址
3.1.4 存储器寻址方式
指令中给出操作数的主存地址信息(偏移
地址,称之为有效地址EA),而段地址在 默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量
段地址对应BX/SI/DI寄存器默认是DS,对应BP
寄存器默认是SS;可用段超越前缀改变 MOV AX,[DI+06H]; mov ax,table[di] ;AX←DS:[DI+06H] MOV AX,[BP+06H] ;AX←SS:[BP+06H] 相对寻址
;AX←DS:[BX+SI+06H]
相对基址变址
位移量可用符号表示 同一寻址方式有多种表达形式
指令操作数的表达-寄存器
r8——任意一个8位通用寄存器
AH AL BH BL CH CL DH DL
r16——任意一个16位通用寄存器
AX BX CX DX SI DI BP SP
reg——代表r8或r16
(4)基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内容加上
变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对应BP
基址寄存器默认是SS;可用段超越前缀改变 MOV AX,[BX+SI] ;AX←DS:[BX+SI] MOV AX,[BP+DI] ;AX←SS:[BP+DI] MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]
微机原理第三章 80x86的指令系统和寻址方式
指针送寄存器和ES指令: LES REG, SRC 执行操作: (REG) (SRC) (ES) (SRC+2)
相继二字 寄存器、ES
例:LEA BX, [BX+SI+0F62H]
LDS SI, [10H] LES DI, [BX]
MOV BX, TABLE 40 H 00 H 00 H 30 H
存 储 器 寻 址
1.立即寻址方式
—— 操作数在指令中给出 指令格式:MOV AL, 5 MOV AX, 3064H MOV AL, ‘A’ ;A的ASCII码 * 只能用于 SRC 字段 MOV 40H, AL
* SRC 和 DST 的字长一致 MOV AH, 3064H
2.寄存器寻址方式 —— 操作数在指定的寄存器中
……
…… RET 例: PUSH AX PUSH BX PUSH CX …… POP POP CX BX ;其间用到AX、BX、CX
; 后进先出
POP
AX
交换指令
执行操作
注意:
XCHG OPR1, OPR2
(OPR1) (OPR2)
* 不影响标志位
* 不允许使用段寄存器 * 必须有一个操作数在寄存器中 * 不能够使用立即数寻址方式
标志寄存器传送指令
标志送AH指令 执行操作:
AH送标志寄存器指令 执行操作: 标志进栈指令 执行操作: 标志出栈指令 执行操作:
(DI)
7.相对基址变址寻址方式
(BX) (BP) (SI) (DI) 8位 16位
有效地址 =
+
+
位移量
MOV AX, MASK [BX] [SI] 或 MOV AX, MASK [BX+SI] 或 MOV AX, [MASK+BX+SI] * 适用于二维数组的寻址,位移量可存放首地址 * 可使用段跨越前缀
第三章 80x86的寻址方式与指令系统
第三章80x86的寻址方式与指令系统3.1 指令系统概述3.2 80x86的寻址方式3.3 80x86的指令系统3.1 指令系统概述计算机的指令系统是计算机指令的集合,是计算机硬件的语言系统,程序员通过计算机指令使用计算机的硬件,按指令系统提供的指令有序地组成程序,完成特定的功能。
指令包括操作码和操作数两大部分操作码目的操作数(地址),源操作数(地址)如:MOV AX, 012FDH3.1用符号化的汇编语言指令编写的程序输入计算机后,由“汇编程序”把它翻译成二进制机器语言形式,才能在机器上执行。
机器语言指令格式如下:OP MOD DISP(低)DISP(高)DATA(低)DATA(高)OP代表操作码,MOD表示寻址方式,DISP代表位移量,DATA代表数据。
3.1OP 字段的具体信息:OP d/swd/s 位使用在双操作数指令中,因为80x86/88规定双操作数指令的两个操作数必须有一个操作数放在寄存器中:d 位指定所用寄存器用于目的操作数(d=1)还是源操作数(d=0);对于指令中有立即数,s=1表示把8位立即数扩展为16位。
w 位用于表示指令对字(w=1)还是字节(w=0)操作。
OP 字段是指令的第一个字节,8位不够时,还可占用第二个字节的3位,除指定操作功能外,还包含操作对象的特征信息。
MOD字段表示指令寻址方式,占1个字节。
MOD字段的具体信息:MOD REG R/MMOD占2位,用于区分寄存器寻址和存储器寻址,以及使用多少字节的偏移量。
00=存储器寻址方式,无偏移量;01=存储器寻址方式,使用1个字节偏移量(-128≤DISP≤127);10=存储器寻址方式,使用2个字节偏移量(0≤DISP≤65535);11=寄存器寻址方式,R/M表示寄存器,并与OP字段的w位一起决定寄存器是8位还是16位。
REG用于选择寄存器,并与OP字段的w位一起决定寄存器是8位还是16位。
MOD中寄存器的选择:REG或MOD=11的R/M w=0w=1000AL AX001CL CX010DL DX011BL BX100AH SP101CH BP110DH SI111BH DI3.1 R/M对有效地址形成的规定MOD R/M 00011011默认段寄存器w=0w=1000(BX)+(SI)(BX)+(SI)+DISP8(BX)+(SI)+DISP16AL AX DS001(BX)+(DI)(BX)+(DI)+DISP8(BX)+(DI)+DISP16CL CX DS010(BX)+(SI)(BX)+(SI)+DISP8(BX)+(SI)+DISP16DL DX SS011(BX)+(DI)(BX)+(DI)+DISP8(BX)+(DI)+DISP16BL BX SS100(SI)(SI)+DISP8(SI)+DISP16AH SP DS101(DI)(DI)+DISP8(DI)+DISP16CH BP DS110直接地址(SP)+DISP8(SP)+DISP16DH SI SS111(BX)(BX)+DISP8(BX)+DISP16BH DI DS3.1默认段寄存器是没有段跨越前缀时隐含的段寄存器,但如果在指令前指定了段跨越前缀,则使用指定段寄存器。
第3章 80X86的寻址方式和指令系统
(ESP)
(ESP)+32
出栈的ESP值丢弃!
(5)XCHG交换指令
格式: XCHG OPR1,OPR2 操作:(OPR1) (OPR2) 说明: 1)允许字/字节操作。386及其后继机型还允许双 字操作。不影响Flags。
2)交换在:通用Reg间、Reg与Mem间,不包 括段Reg,不允许Mem与Mem间,也不能有im.
(AL)=4
Bx
0的段码 1的段码 2的段码 3的段码 4的段码 5的段码
…..
ex3.39
(AL)=0FH
(DS)=F000H
(BX)=0040H(表首址) PA=16x(DS)+(BX)+(AL)
Bx AL 表首址
=F0000H+0040H+0FH ….
2C
F004F
=F004FH
执行XLAT后
Ex 3.33
PUSHAD
执行后,堆栈段
执行前,堆栈段
低地址 (ESP)
(ESP)原
(EDI) (ESI) (EBP) (ESP)原 (EBX) (EDX) (ECX) (EAX)
-32 -28 -24 -20 -16 -12 -8 -4
4)出栈操作
格式:POP DST ;双字/字 16位操作: ( DST) ((SP)+1,(SP)) (SP) (SP)+2 32位操作: (DST) ((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) (ESP) (ESP)+4 说明:DST可以是通用寄存器、段寄存器(CS除外)、 字存储单元,不影响Falgs。
Ex3.28 MOVZX EAX,Data 将Data单元中的16位数零扩展为32位数,送入EAX寄存 器中。 3)MOV、MOVSX、MOVZX的区别: MOV:源操作数、目的操作数等长 MOVSX、MOVZX:源操作数长度要小于目的操作数的长度。 P115 练习3.44 (1)MOV BX,-12 (BX)=0FFF4H MOVSX EBX,BX (EBX)=0FFFFFFF4H (3) MOV AH,7 (AH)=07H MOVZX ECX,AH (ECX)=00000007H
第三章 80X86寻址方式和指令系统
例3.6 寄存器相对寻址
第三章 80x86寻址方式和指令系统
第三章 80x86寻址方式和指令系统
寄存器相对寻址过程示意
第三章 80x86寻址方式和指令系统
4、基址变址寻址
操作数在存储单元中,其有效地址EA可表示为
EA=
(BX) (BP)
(SI) (DI)
例1 MOV AX,[BX+SI] 或写成:MOV AX,[BX][SI] 例2 MOV AX,[BX+DI] 例3 MOV AX,[BP+SI] 例4 MOV AX,[BP+DI]
寄存器间接寻址 基址变址寻址
第三章 80x86寻址方式和指令系统
1、直接寻址
操作数在存储器单元中。 操作数所在的有效地址EA直接由指令指出。
例1 MOV AX,[3000H] 例2 MOV BL,BLOCK 例3 MOV BX,DATA1
例3.3 直接寻址
第三章 80x86寻址方式和指令系统
第三章 80x86寻址方式和指令系统
例2 MOV AX,[BP+DI+1000H]
例3.8 相对基址变址寻址 第三章 80x86寻址方式和指令系统
第三章 80x86寻址方式和指令系统
相对基址变址寻址过程示意
第三章 80x86寻址方式和指令系统
(二)32位指令模式下的存储器寻址
32位指令模式寻址结构由5部分组成: 段址+基址+变址﹡比例因子+偏移量
例3.1 立即寻址
第三章 80x86寻址方式和指令系统
第三章 80x86寻址方式和指令系统
立即寻址过程示意
第三章 80x86寻址方式和指令系统
二、寄存器寻址
操作数在寄存器中。 32位寄存器:EAX、EBX、ECX、EDX、ESP、EBP、
80X86的指令系统和寻址方式
- 字串:一串连续的字。
- 双字串:一串连续的双字。
3.2 80X86的寻址方式
• 数据寻址方式:是指获取指令所需的操 作数或操作数地址的方式
• 程序寻址方式:是指程序中出现转移和 调用时的程序定位方式
3.2.1 80X86的数据寻址方式 (共十种)
1、立即寻址方式
操作数作为指令的一部分,在直接指令中给出。
3.2.3操作数宽度和寻址宽度的确定
• 操作数宽度也称为“操作尺寸” • 寻址宽度也称为“寻址尺寸” • 实际上指的是操作数二进位数和可寻址的二进位数。 • 8086和80286的操作数宽度和寻址宽度都是16位的。 • 而32位处理器的操作数宽度和寻址宽度可以是16位的,
也可以是32位的,涉及到W域、缺省段属性及指令前缀 等概念。
按指令码中规定的寻址方式给出。此时,寻址所得到的不 是操作数,而是转移地址,用来更新IP内容。
JMP BX
..
2000:0FFFH
操作码
.. ..
2000:4000H
操作码
CS + BX(新 IP)
2000 4000
24000
..
(3)段间直接寻址 在段间直接寻址方式中,指 令码中将直接给出16位的段 地址和16位的段内偏移地址, 用来更新CS和IP内容。
汇编语言指令要解决的两个问题: 要指出进行什么操作——操作符; 要指出操作数和操作结果放在何处——寻址方式。
指令的基本构成:
目的
源
说明要执行的 操作对象,可以 是什么操作 有0个、1个或2个
指令举例: MOV AX , BX
操作码 操作数 ADD AX,[SI+6] INC BX NOP
第三章 80x86的指令系统和寻址方式
有效地址的计算:
EA = 基址 + 变址 + 位移量
15
第三章 80x86的指令系统和寻址方式
段跨越
在存储器内进行寻址时,不同的寻址方式 会对应不同的默认段。 如果需要改变默认段,则需使用段跨越前 缀。如: mov ax,es:[2000H] 以下三种情况不允许段跨越:
– 串处理指令的目的串必须用ES段 – PUSH指令的目的和POP指令的源必须用SS段 – 指令必须存放在CS段中
AH AL
30
50 50 30 32000 32001
(AX) = 3050H
操作数地址也可由变量(符号地址)表示
等价
MOV AH, VALUE
MOV AH, [VALUE]
( VALUE DB 10 )
17
第三章 80x86的指令系统和寻址方式
直接寻址方式* * 隐含的段为数据段 DS * 可使用段跨越前缀 MOV AX, ES :[2000H] * 使用变量时,要注意变量的属性
第三章 80x86的指令系统和寻址方式
3.1 80x86的寻址方式 3.2 程序占有的空间和执行时间 3.3 80x86的指令系统
1
第三章 80x86的指令系统和寻址方式
教学重点 第 3 章是本课程的一个关键内容,是程序设计的 基础
基础是熟悉寄存器组
难点是各种寻址方式
重点是掌握8086常用指令的功能及应用
5
第三章 80x86的指令系统和寻址方式
3.1 IBM PC机的寻址方式
与数据有关的寻址方式
与转移地址有关的寻址方式
3.1.1 与数据有关的寻址方式
以 MOV 指令为例 操作码
操作数1,操作数2
汇编语言程序设计-80X86指令系统和寻址方式
1.数据传送类指令 • 数据传送类指令用于实现CPU的内部寄存器之间 • CPU内部寄存器和存储器之间 • CPU累加器AX或AL和I/O端口之间的数据传送 此类指令除了SAHF和POPF指令外均不影响标志寄存器的
内容。 在数据传送指令中,源操作数和目的操作数的数据长度
必须一致。
(1)MOV指令
指令功能:把AX中的16位数或AL中的8位数输出到指定端口。
例 3.26
OUT 22H, AL
(4)段间间接寻址方式 这种寻址方式是由指令中给出的存储器数据寻址方式,包括存
放转移地址的偏移量和段地址。其低位字地址单元存放的 是偏移地址,高位字地址单元中存放的是转移段基值。这 样既更新了IP内容又更新了CS的内容,故称为段间间接寻 址。 例 JMP WORD PTR[BX] ;转移到当前代码位置内 ;有效地址存放在BX寻址的单元中
;物理地址=DS×16+SI
MOV [DI], DX
;物理地址=DS×16+DI
2) 以BP进行寄存器间接寻址(BP作为地址指针)的方式
隐含的段寄存器为堆栈段寄存器SS,操作数存放在堆栈段区域, 将堆栈段寄存器SS的内容左移4位,再加上基址寄存器BP的 内容,即为操作数的物理地址。
例
MOV [BP], BX
OP
DW
OP
SW
操作码格式
8086指令格式
几点说明: ① 一条指令可以包含一个操作数,也可以包含一个以上的操作
数;一个操作数的指令称为单操作数指令,单操作数指令中 的操作数可能由指令本身提供,也可能由指令隐含地指出。 ② 若位移量或立即数为16位,那么在指令代码中,将低位字节 放在前面,高位字节放在后面。 ③ 8086指令系统中大多数指令的操作码只占用第一个字节,但 有几条指令是特殊的,其指令中的第一个字节不但包含操作 码成分,而且还隐含地指出了寄存器名,从而整个指令只占 一个字节,成为单字节指令。这些指令字节数最少,执行速 度最快,用得也最频繁。
汇编语言:第3章80x86的指令系统和寻址方式I
MOV AH, 2
MOV AH, 4CH
被编译成二进制代码 B402
被编译成二进制代码 B44C
MOV CX,2A50H
注意
下列指令错 • MOV AH,500 • MOV 50,AL • 不能直接给段寄存器和标志寄存器赋予 立即数。下面的指令是错误的: MOV DS, 1250H
2.寄存器寻址
(EAX)=87654321H
• 物理地址=16dx 段基地址+(寄存器)
练 习
如 果 (DS)=4000H , (SS)=3000H , (BP) = 2000H , (32000H)=1234H , (42000H) =5678H,(ES)=5000H, 执行 MOV AX,[BP] 结果为: (AX)=?
• 操作码(操作的性质) – 表示指令应完成的具体操作 – 以助记符的形式表示 • 操作数(操作的对象) – 表示指令的操作对象(参与操作的对象) – 源操作数、目的操作数
操作数字段
• 指令分类:(按操作数分) – 单操作数指令:OPR DEST – 双操作数指令:OPR DEST, SRC – 三操作数指令:OPR DEST,SRC,SRC1 – 无操作数: OPR (隐含操作数) • 指令的操作码字段和操作数字段的表示 • 每个操作用确定的二进制代码表示 • 操作数字段:情况很多,也很复杂 • 汇编用助记符表示操作码,用符号或符号地址 表操作数
指令、程序初步-1
• 从键盘输入一个字符,然后从屏幕输出 CODE SEGMENT ASSUME CS:CODE START: MOV AH,1 INT 21H MOV DL,AL MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1)传送指令MOV —寄存器之间数据传送
MOV reg,reg
mov ax,bx mov ah,al mov ds,ax
;(ax) ← (bx) ,字传送 ;(ah) ← (al) ,字节传送 ;(ds) ← (ax) ,字传送
CS只能出现在SRC的位置
1)传送指令MOV —寄存器与存储器之间数据传送
基本概念—指令在机器中的表示
在机器中,指令的操作码、操作数 都用二进制代码表示。——机器指令。
基本概念—8086指令的基本格式
操作码 [目的操作数][,源操作数][;注释]
DEST SRC
[ ]内的内容可缺省 书写注意事项: 操作码与操作数至少有一个空格或制表 符分隔 操作数之间必须用“,”相分隔, DEST 在前, SRC在后
立即数寻址指令
MOV AL,05H ;AL←05 MOV AX,0102H ;AX←0102H
MOV 05H,AL MOV [2000H],05H
×
MOV [2000H],BYTE PTR 05H
MOV [2000H],WORD PTR 05H
MOV [2000H],DWORD PTR 05H
立即数寻址的功能
3. 直接寻址
在指令中直接给出存储器偏移地址
操作数的16位偏移量直接包含在指令中,与操作码 一起放在代码段中
用符号表示的位移量
MOV BX,VAR ← → MOV BX,DS:VAR ;表示将用符号VAR表示的字单元的内容→ AX ;不声明段则默认为数据段,指明段寄存器则可实现 段跨越
用常数表示的位移量
1.立即(数)寻址
指令中的操作数直接存放在机器代码中,紧跟 在操作码之后(操作数作为指令的一部分存放 在操作码之后的主存单元中) 这种操作数被称为立即数imm
它可以是8位数值i8(00H~FFH) 也可以是16位数值i16(0000H~FFFFH)
立即数寻址方式常用来给R/M赋值 立即数只能用于源操作数
4. 寄存器间接寻址
MOV AX,[SI] MOV CL,[BX] MOV BL,[BP] ← → MOV AX, DS:[SI] ← → MOV CL, DS:[BX] ← → MOV BL, SS:[BP]
寄存器间接寻址的功能
寄存器间接寻址的执行
5.寄存器相对寻址方式
直接变址寻址,基址寻址,变址寻址 有效地址是寄存器内容与有符号8位或16位位移 量之和,寄存器可以是BX、BP或SI、DI EA = BX/BP 或 SI/DI +0/8/16位位移量
(AL)=56H
(AL)=78H
数据段
数组内某元素距数组 起始单元的偏移 (SI)=4 (AL)=9AH
(SI)
通过修改SI可遍历整个数组
6.基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内 容加上变址寄存器(SI或DI)的内容构成:
EA=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对 应BP基址寄存器默认是SS;可用段超越 前缀改变
有效地址是基址寄存器(BX/BP)、变址寄存 器(SI/DI)与一个8位或16位位移量之和:
EA=BX/BP+SI/DI+8/16位位移量
该方式中,BX/BP选一,SI/DI选一 段地址对应BX基址寄存器默认是DS,对应BP 基址寄存器默认是SS;可用段超越前缀改变
7.相对基址变址寻址方式
MOV AX, 06H[BX+SI] ← → MOV AX, DS:[BX+SI+06H] MOV AL,TAB[BX][DI] ← → MOV AL,DS:TABLE[BX][DI] MOV DWORD[BP][SI],DX ← → MOV SS:DWORD[BP][SI],DX
MOV AX,ARRAY[BX][BP] MOV AX,DA[SI][DI]
DEST可以是8/16位的R(CS、IP除外)/M SRC可以是8/16位的R/M/立即数
只能出现在源操 作数的位置
1)传送指令MOV—立即数传送
MOV reg/mem,imm ;立即数送寄存器或主存
mov al,4 注意立即数是字节量还是字量 ;(al)←4,字节传送 mov cx,0ffh ;(cx)←00ffh,字传送 明确指令是字节操作还是字操作 mov si,200h ;(si)←0200h,字传送 mov byte ptr [si],0ah ;byte ptr 说明是字节操作 mov word ptr [si+2],0bh
重点掌握
MOV XCHG XLAT PUSH POP LEA
1. 通用数据传送指令
提供方便灵活的通用传送操作 有3条指令
MOV
XCHG
XLAT
1)
传送指令MOV(move)
格式:MOV DEST,SRC 功能:将源操作数的内容传送至目的操作数中
即(DEST) ← (SRC) 说明:
第3章 80x86的指令系统和寻址方式
§ 3.1 § 3.3 § 3.4
80x86的寻址方式 80x86的指令系统 80x86的机器语言指令概况
基本概念—指令系统
每一种计算机都有一组指令集供 用户使用,这组指令集称为该计算机 的指令系统。指令集中的每条指令在 汇编语言中都是用助记符来表示的。
基本概念—指令系统的要求
SRC与DEST不能同时为存储器操作数—8086 不支持两个存储单元间数据的直接传送 SRC与DEST不能同时为段寄存器 不能将立即数直接传送到段寄存器
寄存器相对寻址的功能
寄存器相对寻址的执行
代码段
操作码 24H 00H
MOV AL,0024H[SI] EA=24H+(SI) (SI)=0 (AL)=12H 可看作数据起始单元 的偏移量 (SI)=1 (AL)=34H
DS
12H 34H 56H 78H 9AH 0024H
(SI)=2
(SI)=3
× ×
31A00
3000:1A00
MOV AL,ARRAY[BX][SI]
数据段 DS ARRAY
二维数组起始单元
EA
⊕
BX
SI
[ ]之间表示相加的关系 BX、SI分别存放数组的脚标 [BX][SI] ← → [BX+SI]
二、与转移地址有关的寻址方式
程序代码亦存放在存储器中,如 何控制程序的走向(转移位置的地 址CS:IP)是本部分所涉及的内容, 由于它们与具体的指令相关,他们 的介绍放在指令中讲解。
基本概念—8086指令的基本格式
每种指令的操作码:
用一个唯一的助记符表示(指令功能的英文 缩写) 对应着机器指令的一个二进制编码 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址
指令中的操作数:
基本概念—寻址方式
所谓寻址就是寻找操作数的地址。
指令中的操作数可能直接给出,也可能放在寄存器 里,也可能放在存储器中。
基址寻址 变址寻址
段地址对应BX/SI/DI寄存器默认是DS,对应BP 寄存器默认是SS;可用段超越前缀改变 该方式不仅可以修改指针,还可以修改位移量, 对数组操作十分方便
5.寄存相对寻址方式
MOV AX,10H[SI] ← → MOV AX,DS:10H[SI] MOV AX,ARRAY[BX] ← → MOV AX,DS:ARRAY[BX] MOV TABLE[DI],AL ← → MOV DS:TABLE[DI],AL MOV TABZ[BP],BL ← → MOV SS:TABZ[BP],BL MOV DL,ES:STRING[SI] ← → 跨越段前缀 比较实用于表格处理,表格首地址可设置为位移量, 利用修改基址或变质寄存器的内容来取得表格中的 值。
立即数寻址的执行
2. 寄存器寻址
操作数存放在CPU的内部寄存器reg中, 可以是:
8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP 4个段寄存器seg: CS、DS、SS、ES
MOV BX,AX
;BX←AX
寄存器寻址的功能
MOV AL,D_BYTE MOV DX,[BP] ;DX←SS:[BP]
MOV DL,[SI] ;DL←DS:[SI]
MOV DS,AX SRC与DEST的长度必须一致 DEST不能为CS、IP及立即数
例: DS ← ES 错误示例: MOV VAR1,VAR2 1)传送指令MOV AX,BL 错误示例: MOV 例: AX,DATA 错误: MOVMOV DS,ES 正确实现: MOV AL,VAR2 —使用该指令应注意的问题 MOV MOV CL,3824H DS,AX 正确实现: MOV VAR1,AL MOV AX,ES
完备性 有效性 规整性(对称性和均齐性) 兼容性
基本概念—指令的构成
操作码 操作数
指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运 算、移位、跳转等操作,它是指令中不可缺少的 组成部分 操作数是指令执行的参与者,即各种操作的对象
有些指令不需要操作数,通常的指令都有一个或 两个操作数,也有个别指令有3个甚至4个操作数
§ 3.3
指令分类
80x86的指令系统
功能
数据传送指令 算术运算指令 逻辑指令 串操作指令 程序转移指令 处理器控制指令
格式
双操作数指令(DEST,SRC) 单操作数指令(DEST) 无操作数指令(隐含,按约定寻找操作数)