寻址方式
2017-09-26 16:24
375 查看
80x86寻址方式
一、指令寻址
1、顺序寻址方式
指令在内存中按顺序排放,依次取出必须使用程序计数器(又称指令计数器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。
2、跳跃寻址方式
当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。
注意,程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。
指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。
二、操作数寻址
1、隐含寻址
在指令中隐含着操作数的地址。例如,单地址的指令格式,就不明显地在地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址。
指令格式明显指出的仅是第1操作数的地址D。因此,累加寄存器AC对单地址指令格式来说是隐含地址。
2、立即寻址
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:
MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H
其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
3、直接寻址
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?
解:
由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;
访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;
取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。
所以,在执行该指令后,BX的值就为5213H。
由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。
下面指令的目标操作数就是带有段前缀的直接寻址方式。
MOV ES:[1000H], AX
直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。
注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
比较:
MOV AX, 1234H MOV AX, [1234H]
前者是立即寻址,后者是直接寻址
MOV AX, VARW MOV AX, [VARW]
两者是等效的,均为直接寻址
4、寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
5、寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBXMOV AX, BXMOV DH, BL等。
由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。
6、寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。
在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?
解:
根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(SI)+100H=2345H+100H=2445H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2445H=12445H。
所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。
7、基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?
解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(BX)+(SI)=2100H+0011H=2111H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2111H=12111H
所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。
8、相对基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?
解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2310H=12310H
所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。
从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。
相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。
MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]
但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。
转:
相对基址加变址寻址方式与其它寻址方式之间的变形关系
9、段内寻址
指令中给出带符号的相对偏移量,程序目标地址为当前IP值(即转移或调用指令的下一条指令地址),加上相对偏移量作为偏移地址。
附:
80x86指令编码格式
是指指令的机器码表示格式,其最多可以由以下5部分组合构成:
前 缀 操作码 寻址方式 偏移量 立即数
0~2字节 1~2字节 0~2字节 0~4字节 0~4字节
1、前缀(使16位←→32位)
指令前缀有两种:
地址长度前缀
操作数长度前缀
汇编程序在汇编时,根据当前代码段的USE属性、地址长度属性、操作数长度属性决定是否产生前缀。可以将指令操作数或地址长度,由16位转换到32位,或由32位转换到16位。
(1)操作数长度前缀 (66H)
用于改变当前指令模式操作数长度缺省值。
当16位指令模式下,操作数用32位寄存器,则在指令前加前缀66H;
当在32位指令模式下,操作数用16位寄存器,则在指令前加前缀66H,允许用16位寄存器。
(2)地址长度前缀 (67H)
用于改变当前指令模式地址长度缺省值。其用法与操作数指令长度类似。
例如在16位指令模式下,指令汇编后机器码如下:
67668B03 MOV AX,WORD PTR[EBX]
在指令机器码前加前缀67H和66H,表示允许使用32位寄存器,但地址长度为16位,允许地址范围为64KB内。
(2)地址长度前缀 (67H)
用于改变当前指令模式地址长度缺省值。其用法与操作数指令长度类似。
例如在16位指令模式下,指令汇编后机器码如下:
67668B03 MOV AX,WORD PTR[EBX]
在指令机器码前加前缀67H和66H,表示允许使用32位寄存器,但地址长度为16位,允许地址范围为64KB内。
2、操作码及寻址方式
操作码及寻址方式属于指令中最基本组成部分,大多数指令编码格式为:
操作码——规定处理器执行的操作,如传送,加、减等,具体操作采用编码表示。
其中:
D位——规定数据流的方向,为第2字节指定的R/M域和REG域之间数据流动方向。
W位——规定操作数长度是字节,字或双字。
3、寻址方式——寻找操作数的方式。
7 6 5 3 2 0
mod reg r/m
MOD域——选择寻址类型,指定R/M域为寄存器还是存储器,如为存储器,还要指定是否有偏移量。
REG域——采用三位编码表示8个寄存器。
R/M域——表示寄存器或存储器,由MOD域指定,如为寄存器,则与REG域相同;如为存储器,则表示8种寻址方式。
4、偏移量及立即数
偏移量——允许指令中直接给出寻址方式所需的偏移量。
立即数——允许指令中直接给出操作数。
5、 80x86指令格式
指令格式是指指令在源程序中的书写格式,指令基本格式为:
[标号]:助记符 操作数;注释
· 标号——某条指令所存单元的符号地址,其后要跟冒号。
标号一般是由字母开头,允许使用字母、数字及特殊字符(?,·,@,一,$)。不允许使用保留字(关键字),例如ADD,MOV,END等。
· 助记符——命令符号,例如,ADD、SUB。
· 操作数——指令中可以无操作数,也可以有1~3个操作数。操作数之间用逗号分开。
例如: MOV Dest,Src
为数据传送指令,Src表示源操作数,Dest表示目的操作数,数据流动的方向是由Src源操作数传送到Dest目的操作数,操作数可以是寄存器或存储器操作数。
· 注释——由分号(;)开始,用来对指令功能加以说明,使程序便于阅读,汇编程序对它不进行处理。
(1) 通用寄存器操作数(Reg)
8位Reg :AL、AH、BL、BH、
CL、CH、DL、DH;
16位Reg :AX、BX、CX、DX、
SI、Dl、SP、BP;
32位Reg :EAX、EBX、ECX、EDX、
ESI、EDI、 ESP、EBP。
(2) 存储器操作数 (Mem)
间接寻址时:
16位寻址寄存器包括BX、BP、SI、DI;
32位寻址寄存器包括EAX、EBX、ECX、EDX、ESI、EDI、EBP。
其中:BP、EBP对应的缺省段寄存器为SS,
其它寄存器对应的缺省段寄存器为DS。
(3) 存储器操作数缺省数据类型,在16位指令模式时为字类型,在32位指令模式时为双字类型。可使用PTR伪指令改变数据类型,即
字节类型 BYTE PTR[Reg]
字类 型 WORD PTR[Reg]
双字类型 DWORD PTR[Reg]
(4) 段寄存器操作数 (Seg)——为16位段寄存器,包括CS,DS,ES,SS,FS,GS。
(5) 立即数 (imm)——只允许作为源操作数,其数据类型由目的操作数来限定。
对于指令的分析,须注意以下4点:
·指令的功能;
·适用于指令的寻址方式;
·指令对标志位的影响;
·指令长度和执行时间。
一、指令寻址
1、顺序寻址方式
指令在内存中按顺序排放,依次取出必须使用程序计数器(又称指令计数器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。
2、跳跃寻址方式
当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。
注意,程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。
指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。
二、操作数寻址
1、隐含寻址
在指令中隐含着操作数的地址。例如,单地址的指令格式,就不明显地在地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址。
指令格式明显指出的仅是第1操作数的地址D。因此,累加寄存器AC对单地址指令格式来说是隐含地址。
2、立即寻址
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:
MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H
其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
3、直接寻址
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?
解:
由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;
访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;
取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。
所以,在执行该指令后,BX的值就为5213H。
由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。
下面指令的目标操作数就是带有段前缀的直接寻址方式。
MOV ES:[1000H], AX
直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。
注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
比较:
MOV AX, 1234H MOV AX, [1234H]
前者是立即寻址,后者是直接寻址
MOV AX, VARW MOV AX, [VARW]
两者是等效的,均为直接寻址
4、寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
5、寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBXMOV AX, BXMOV DH, BL等。
由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。
6、寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。
在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?
解:
根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(SI)+100H=2345H+100H=2445H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2445H=12445H。
所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。
7、基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?
解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(BX)+(SI)=2100H+0011H=2111H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2111H=12111H
所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。
8、相对基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?
解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
该操作数的物理地址应由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2310H=12310H
所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。
从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。
相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。
MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]
但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。
转:
相对基址加变址寻址方式与其它寻址方式之间的变形关系
源操作数 | 指令的变形 | 源操作数的寻址方式 |
只有偏移量 | MOV AX, [100H] | 直接寻址方式 |
只有一个寄存器 | MOV AX, [BX] 或 MOV AX, [SI] | 寄存器间接寻址方式 |
有一个寄存器和偏移量 | MOV AX, [BX+100H] 或 MOV AX, [SI+100H] | 寄存器相对寻址方式 |
有二个寄存器 | MOV AX, [BX+SI] | 基址加变址寻址方式 |
有二个寄存器和偏移量 | MOV AX, [BX+SI+100H] | 相对基址加变址寻址方式 |
指令中给出带符号的相对偏移量,程序目标地址为当前IP值(即转移或调用指令的下一条指令地址),加上相对偏移量作为偏移地址。
附:
80x86指令编码格式
是指指令的机器码表示格式,其最多可以由以下5部分组合构成:
前 缀 操作码 寻址方式 偏移量 立即数
0~2字节 1~2字节 0~2字节 0~4字节 0~4字节
1、前缀(使16位←→32位)
指令前缀有两种:
地址长度前缀
操作数长度前缀
汇编程序在汇编时,根据当前代码段的USE属性、地址长度属性、操作数长度属性决定是否产生前缀。可以将指令操作数或地址长度,由16位转换到32位,或由32位转换到16位。
(1)操作数长度前缀 (66H)
用于改变当前指令模式操作数长度缺省值。
当16位指令模式下,操作数用32位寄存器,则在指令前加前缀66H;
当在32位指令模式下,操作数用16位寄存器,则在指令前加前缀66H,允许用16位寄存器。
(2)地址长度前缀 (67H)
用于改变当前指令模式地址长度缺省值。其用法与操作数指令长度类似。
例如在16位指令模式下,指令汇编后机器码如下:
67668B03 MOV AX,WORD PTR[EBX]
在指令机器码前加前缀67H和66H,表示允许使用32位寄存器,但地址长度为16位,允许地址范围为64KB内。
(2)地址长度前缀 (67H)
用于改变当前指令模式地址长度缺省值。其用法与操作数指令长度类似。
例如在16位指令模式下,指令汇编后机器码如下:
67668B03 MOV AX,WORD PTR[EBX]
在指令机器码前加前缀67H和66H,表示允许使用32位寄存器,但地址长度为16位,允许地址范围为64KB内。
2、操作码及寻址方式
操作码及寻址方式属于指令中最基本组成部分,大多数指令编码格式为:
操作码——规定处理器执行的操作,如传送,加、减等,具体操作采用编码表示。
其中:
D位——规定数据流的方向,为第2字节指定的R/M域和REG域之间数据流动方向。
W位——规定操作数长度是字节,字或双字。
3、寻址方式——寻找操作数的方式。
7 6 5 3 2 0
mod reg r/m
MOD域——选择寻址类型,指定R/M域为寄存器还是存储器,如为存储器,还要指定是否有偏移量。
REG域——采用三位编码表示8个寄存器。
R/M域——表示寄存器或存储器,由MOD域指定,如为寄存器,则与REG域相同;如为存储器,则表示8种寻址方式。
4、偏移量及立即数
偏移量——允许指令中直接给出寻址方式所需的偏移量。
立即数——允许指令中直接给出操作数。
5、 80x86指令格式
指令格式是指指令在源程序中的书写格式,指令基本格式为:
[标号]:助记符 操作数;注释
· 标号——某条指令所存单元的符号地址,其后要跟冒号。
标号一般是由字母开头,允许使用字母、数字及特殊字符(?,·,@,一,$)。不允许使用保留字(关键字),例如ADD,MOV,END等。
· 助记符——命令符号,例如,ADD、SUB。
· 操作数——指令中可以无操作数,也可以有1~3个操作数。操作数之间用逗号分开。
例如: MOV Dest,Src
为数据传送指令,Src表示源操作数,Dest表示目的操作数,数据流动的方向是由Src源操作数传送到Dest目的操作数,操作数可以是寄存器或存储器操作数。
· 注释——由分号(;)开始,用来对指令功能加以说明,使程序便于阅读,汇编程序对它不进行处理。
(1) 通用寄存器操作数(Reg)
8位Reg :AL、AH、BL、BH、
CL、CH、DL、DH;
16位Reg :AX、BX、CX、DX、
SI、Dl、SP、BP;
32位Reg :EAX、EBX、ECX、EDX、
ESI、EDI、 ESP、EBP。
(2) 存储器操作数 (Mem)
间接寻址时:
16位寻址寄存器包括BX、BP、SI、DI;
32位寻址寄存器包括EAX、EBX、ECX、EDX、ESI、EDI、EBP。
其中:BP、EBP对应的缺省段寄存器为SS,
其它寄存器对应的缺省段寄存器为DS。
(3) 存储器操作数缺省数据类型,在16位指令模式时为字类型,在32位指令模式时为双字类型。可使用PTR伪指令改变数据类型,即
字节类型 BYTE PTR[Reg]
字类 型 WORD PTR[Reg]
双字类型 DWORD PTR[Reg]
(4) 段寄存器操作数 (Seg)——为16位段寄存器,包括CS,DS,ES,SS,FS,GS。
(5) 立即数 (imm)——只允许作为源操作数,其数据类型由目的操作数来限定。
对于指令的分析,须注意以下4点:
·指令的功能;
·适用于指令的寻址方式;
·指令对标志位的影响;
·指令长度和执行时间。
相关文章推荐
- 心血来潮的复习了下汇编的寻址方式!
- 汇编 寻址方式总结
- ARM 汇编指令学习:[1]ARM指令寻址方式
- 寻址方式
- ARM处理器体系结构知识—[1]寻址方式
- ARM寄存器的8种寻址方式01
- Linux内核源代码情景分析读书笔记(1)-Intel X86CPU寻址方式
- 寻址方式
- IP网络5种基本寻址方式 (单播、多播、广播、任播、地域多播)
- 1.2 Intel X86 CPU系列的寻址方式
- 汇编学习笔记--更灵活的寻址方式
- [汇编]8086寻址方式
- 寻址方式
- 汇编语言基础教程-寻址方式
- 汇编语言寻址方式(Linux)
- 硬盘寻址方式
- 32位cpu的寻址方式
- ARM汇编--寻址方式
- arm 指令的寻址方式
- 汇编语言: 实验七 寻址方式在结构化数据访问中的应用