汇编语言学习笔记之与转移地址有关的寻址方式

标签:
电脑汇编语言学习笔记转移地址寻址方式杂谈 |
分类: 学习积累 |
汇编语言学习笔记之与转移地址有关的寻址方式
SHORT表示位移量在-128~127字节之间。
NEAR表示在同一段内转移,位移量在-32768~32767字节范围内。
FAR表示转移距离超过±32K字节,或是在不同段之间转移。
因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。
SHORT转移,称为短转移,位移量用一个字节(8位)来表示。
NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。
FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。
与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的。
3.1.2.1
段内直接寻址(Intrasegment direct
addressing)
这种寻址方式在指令中直接指出转向地址,如:
JMP SHORT NEXT
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。如下图所示。
http://s1/middle/5fc04b6dh8095c2171a10&690
例3.9 段内直接寻址方式
1060:000D EB04 JMP SHORT NEXT
IP当前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX]
CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMP SHORT
NEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:
000F + 0004 = 0013
0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。
3.1.2.2 段内间接寻址(Intrasegment indirect
addressing)
这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:
JMP BX
JMP NEAR PTR [BX]
JMP TABLE[SI]
根据指令中的寻址方式,确定一个寄存器或一个存储单元,其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR
PTR是可以缺省的。如左图所示。
注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。
http://s4/middle/5fc04b6dh8095bf77eef3&690
假设: (DS)= 2000H,(BX)=
1256H,(SI)= 528FH,
位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。
http://comic.sjtu.edu.cn/thucs/GD_jsj_019b/images/htmls/lt.gif 例3.10 JMP BX
则执行该指令后(IP)= 1256H
http://comic.sjtu.edu.cn/thucs/GD_jsj_019b/images/htmls/lt.gif 例3.11 JMP [BX][SI]
则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
=(20000H + 1256H + 528FH)
=(264E5H)
= 2450H
3.1.2.3 段间直接寻址(Intersegment direct
addressing)
段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的 操作符FAR
PTR。
指令格式如下:
JMP FAR PTR OUTSEG
因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。如下图所示。
http://s2/middle/5fc04b6dh8095c54a8171&690
3.1.2.4
段间间接寻址(Intersegment indirect addressing)
这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。如左图所示。
为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。指令格式如下:
JMP DWORD PTR [SI]
JMP DWORD PTR[TABLE+BX]
http://s3/middle/5fc04b6dh73422d8a8892&690