第三章 IBM PC机的指令系统和寻址方式 计算机完成的任何功能,都是通过执行一系列指令来实现的,因而每种计算机都有 组指令集提供给用户使用,这组指令集合就称为计算机的指令系统 什么是寻址方式?计算机指令中,为了取得操作数的地址(目的取得操作数的内容) 而进行的寻找该操作数物理地址的方式。 计算机的大部分计算都需要数据参加,这些参加某一指令计算的数据就叫该指令的操 作数。汇编语言的指令格式如下: 操作码操作数1,操作数2,操作数3,…,操作数n 操作码:指示计算机要进行的某种指令操作,在汇编语言中,操作指令采用助记符的形式来 表示操作指令,即操作码 操作数:不同的操作码需要不同的操作数数量,大部分操作码需要的操作数不超过3个,也 有的指令不需要操作数。操作数的类型也是多种多样,它可以是常数、可以是存储单元、可 以是地址、甚至可以某中指令操作码等等。汇编语言中很多操作码需带有两个操作数,就把 前面的操作数称为目的操作数、后面的操作数称为源操作数。 第一节 IBM PC机的寻址方式 与数据有关的寻址方式 (一)立即寻址方式 操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放代码段中,这 种操作数叫立即数(相当高级语言的常量)。立即数可以是8位或16位数,若是16位数则 高位字节存放在高地址中,低位字节存放在低地址中。这种方式如下图所示 指令 操作数 操作码直接对立即数进行操作 立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操作数字 段,不能用于目的操作数字段 例1 则指令执行后,(AL)=05H,8位运算 例2 MOV AX, 3064H 则指令执行后,(AX)=3064H,16位运算 数据的执行过程可用下图示意
第三章 IBM PC 机的指令系统和寻址方式 计算机完成的任何功能,都是通过执行一系列指令来实现的,因而每种计算机都有 一组指令集提供给用户使用,这组指令集合就称为计算机的指令系统。 什么是寻址方式?计算机指令中,为了取得操作数的地址(目的取得操作数的内容) 而进行的寻找该操作数物理地址的方式。 计算机的大部分计算都需要数据参加,这些参加某一指令计算的数据就叫该指令的操 作数。汇编语言的指令格式如下: 操作码 操作数 1,操作数 2,操作数 3,…,操作数 n 操作码:指示计算机要进行的某种指令操作,在汇编语言中,操作指令采用助记符的形式来 表示操作指令,即操作码。 操作数:不同的操作码需要不同的操作数数量,大部分操作码需要的操作数不超过 3 个,也 有的指令不需要操作数。操作数的类型也是多种多样,它可以是常数、可以是存储单元、可 以是地址、甚至可以某中指令操作码等等。汇编语言中很多操作码需带有两个操作数,就把 前面的操作数称为目的操作数、后面的操作数称为源操作数。 第一节 IBM PC 机的寻址方式 一、与数据有关的寻址方式 (一)立即寻址方式 操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放代码段中,这 种操作数叫立即数(相当高级语言的常量)。立即数可以是 8 位或 16 位数,若是 16 位数则 高位字节存放在高地址中,低位字节存放在低地址中。这种方式如下图所示: 操作码直接对立即数进行操作。 立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操作数字 段,不能用于目的操作数字段。 例 1 MOV AL,5 则指令执行后,(AL)=05H,8 位运算 例 2 MOV AX,3064H 则指令执行后,(AX)=3064H,16 位运算 数据的执行过程可用下图示意:
存储器 AX 指令 代码段 OP表示该指令的操作码部分。 (二)寄存器寻址 操作数在寄存器,指令指定寄存器号。对于16位操作数,寄存器可以是AX、BX、CX、 DX、SI、DI、SP相BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH DL和DH。这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因 而可以取得较高的运算速度。这种方式如下图所示: 指令 寄存器 存器号燃作数 例 MOV AX, BX 如指令执行前(AX)=3064H,(BX)=1234H,则指令执行后,(AX)=1234H,(BX)保持不变 除了上述两种寻址方法外,以下介绍的寻址方式的操作数都在除代码段以外的存储区 中,通过不同的方式求得操作数地址,从而取得操作数。 (三)直接寻址 在 IBM PC机中将操作数的偏移地址称为有效地址EA。在直接寻址方式中有效地址EA 就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须 先求出操作数的物理地址,然后再访问存储器才能取得操作数,如下图所示。 段寄存器 段地址 指令 存储器 EA 操作数 如操作数在数据段中,则物理地址=16d×(DS)十EA。1BMPC机中允许数据存放在数 据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段 寄存器。 例 [2000H (DS)=3000H,则执行情况如下图所示。执行结果为:(Ax)=3050
OP 表示该指令的操作码部分。 (二)寄存器寻址 操作数在寄存器,指令指定寄存器号。对于 16 位操作数,寄存器可以是 AX、BX、CX、 DX、SI、DI、SP 相 BP 等;对于 8 位操作数,寄存器可以是 AL、AH、BL、BH、CL、CH、 DL 和 DH。这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因 而可以取得较高的运算速度。这种方式如下图所示: 例 3 MOV AX,BX 如指令执行前(AX)=3064H,(BX)=1234H,则指令执行后,(AX)=1234H,(BX)保持不变。 除了上述两种寻址方法外,以下介绍的寻址方式的操作数都在除代码段以外的存储区 中,通过不同的方式求得操作数地址,从而取得操作数。 (三)直接寻址 在 IBM PC 机中将操作数的偏移地址称为有效地址 EA。在直接寻址方式中有效地址 EA 就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须 先求出操作数的物理地址,然后再访问存储器才能取得操作数,如下图所示。 如操作数在数据段中,则物理地址=16d×(DS)十 EA。1BMPC 机中允许数据存放在数 据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段 寄存器。 例 4 AX , [2000H] (DS)=3000H,则执行情况如下图所示。执行结果为;(Ax)=3050H
存储器 O p 00 代码段 20 30000 32000 50 数据段 30 在汇编语言指令中,可以用符号地址代替数值地址,如 MOV AX, VALUE 此时 VAIUE为存放操作数单元的符号地址。如写成 MOV AX, VALUEJ 也是可以的.两者是等效的。如果 VALUE在附加段中,则应该指定段跨越前缀如下 MOV X, ES: VALUE 10V AX, ES: VALUE 直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直 接寻址方式,将该变量先取到一个寄存器中,然后在做处理。 IBM PC机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。 这也是一个常量常常送到寄存器去的原因 (四)寄存器间接址 操作数的有效地址在基址寄存器BX、BP或变垃寄存器SI、D中,而操作数则在存储 器中,如下图所示。 段寄存器 段地址 指令寄存器 存储器 寄存器 EA 操作数 如果指令中指定的寄存器是BX、SI、D,则操作数在数据段(DS)中,所以用DS寄 存器的内容作为段地址,即操作数的物理地址为: 物理地址=16d×(DS)十(BX) 或物理地址;16d×(DS)+(SI 或物理地址=16d×(DS)+(Dn) 如指令中指定SP寄存器,则操作数在堆栈段(SS)中,段地址在SS中,所以操作数的物 理地址为: 物理地址=16d×(SS)十(SP)
在汇编语言指令中,可以用符号地址代替数值地址,如: MOV AX,VALUE 此时 VAIUE 为存放操作数单元的符号地址。如写成 MOV AX,[VALUE] 也是可以的.两者是等效的。如果 VALUE 在附加段中,则应该指定段跨越前缀如下; MOV AX, ES:VALUE 或 MOV AX, ES:[VALUE] 直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直 接寻址方式,将该变量先取到一个寄存器中,然后在做处理。 IBM PC 机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。 这也是一个常量常常送到寄存器去的原因。 (四)寄存器间接址 操作数的有效地址在基址寄存器 BX、BP 或变垃寄存器 SI、DI 中,而操作数则在存储 器中,如下图所示。 如果指令中指定的寄存器是 BX、SI、DI,则操作数在数据段(DS)中,所以用 DS 寄 存器的内容作为段地址,即操作数的物理地址为: 物理地址=16d×(DS)十(BX) 或 物理地址;16 d×(DS)十(SI) 或 物理地址=16d×(DS)十(DI) 如指令中指定 SP 寄存器,则操作数在堆栈段(SS)中,段地址在 SS 中,所以操作数的物 理地址为: 物理地址=16d×(SS)十(SP)
例5MOV 如果 (DS)=2000H,(BX)=1000H 物理地址=16d×(DS)+(BX)=2000+1000H=21000H 执行结果见下图所示: 存储器 20000 2l000 数 A O 据 50 执行结果为:(AX)=50AOH 指令中也可指定段跨越前缀来取得其他段中的数据。如 MOv AX, ES: [BX 这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出 表格中的下一项 (五)寄存器相对寻址方式 操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量 之和。即 (BX) (BP) 8位 EA (SI) 16位位移量 D1) 样,除有段跨越前缀者外,对于寄存器为BX、SI、DI的情况,段寄存器用DS,而 寄存器BP则使用SS段寄存器的内容作为段地址。这种寻址方式示于下图。 段寄存器 指令 段地址 寄存器位移量 Ea 存储器 轲积寄存器 ⑦操作数 地址 其物理地址计算如下:
例 5 MOV AX ,[BX] 如果 (DS)=2000H , (BX)=1000H 则 物理地址=16d×(DS)十(BX) = 20000H+1000H = 21000H 执行结果见下图所示: 执行结果为:(AX)=50A0H 指令中也可指定段跨越前缀来取得其他段中的数据。如; MOV AX,ES:[BX] 这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出 表格中的下一项。 (五)寄存器相对寻址方式 操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量 之和。即 同样,除有段跨越前缀者外,对于寄存器为 BX、SI、DI 的情况,段寄存器用 DS,而 寄存器 BP 则使用 SS 段寄存器的内容作为段地址。这种寻址方式示于下图。 其物理地址计算如下:
物理地址=16d×(Ds)+(BX)+8位位移量 或(SI)或16位位移量 或(DI) 或 物理地址=16d×(SS)+(BP)+8位位移量 或16位位移量 例6 MOV AX, COUNTISI(也可表示为 MOV AX,[ COUKT十SI; 其中, COUNT为16位位移量的符号地址 如果(DS)=3000H,(SI)=2000 I COUNT=3000H 则物理地址=30000+2000+3000=35000H 指令执行情况如下图所示,执行结果是(AX)=1234H O P 操作码 o P 00 位移量 300UN段 30000 AX COUNT 33000 数 (Si) 135000 据 这种寻址方式同样可用于表格处理,表格的首地址可设置为 COUNT,利用修改基址 或变址寄存器的内容来取得表格中的数值 直接变址寻址方式也可以使用段跨越前缀 (六)基址变址寻址方式 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指 令指定。如果基址寄存器为BX,段寄存器使用DS:如基址寄存器为BP时,段寄存器则用 SS。因此,物理地址为 物理地址=16d×(DS)+(BX)+(SI) 或(DI 或 物理地址=16d×(SS)+(BP)+(S) 或(DI) 这种寻址方式见下图:
例 6 MOV AX,COUNT[SI] (也可表示为 MOv AX,[COUKT 十 SI;] 其中,COUNT 为 16 位位移量的符号地址。 如果(DS)=3000H,(SI)=2000H COUNT=3000H 则物理地址 = 30000 十 2000 十 3000 =35000H 指令执行情况如下图所示,执行结果是(AX)=1234H 这种寻址方式同样可用于表格处理,表格的首地址可设置为 COUNT,利用修改基址 或变址寄存器的内容来取得表格中的数值。 直接变址寻址方式也可以使用段跨越前缀。 (六)基址变址寻址方式 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指 令指定。如果基址寄存器为 BX,段寄存器使用 DS;如基址寄存器为 BP 时,段寄存器则用 SS。因此,物理地址为: 这种寻址方式见下图: