基址寄存器:8086的通用寄存器,就本身而言AX,BX,CX,DX是类似的,都是数据寄存器,用来存放操作数或中间结果,以减少对存储器的访问次数。多数情况下,数据寄存器被用在算术或者逻辑指令运算中进行算术逻辑运算。在有些指令中,则有隐含的用途,如累加器(AX),基址(base)寄存器(BX),计数器(CX),数据寄存器(DX)。这也是BX叫做基址寄存器的由来。
位移量:即偏移量。计算机汇编语言中的偏移量定义为:把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或
在学汇编时,很多初学者对PC的寻址方式和很不理解,甚至是很难理解。的确,这方面的知识是很抽象的,需要比较强的空间想象能力。尤其是我们在输入字符串时,那这些字符是如何进运庆镇行排列的呢?对于,这个问题,我相信很多初学者也是很难想象是如何排列。但是,我可以这样比喻:内存就是有很多栋“楼房”,“楼房”又是由“单元号”,“门户号”差宏组成,那“楼房”就相当于内存地址的段地址,“单元号”就相当于内存的的 偏移地址,“门户号(家)”就相当于“变地址”,而每个单元有16个"门户号(家)",又当我们找到"门户号(家)"后,走进这个"门户号(家)"就会见到里面会有"人",而我们所说的人就是寄存器所指的"内容"了,我画个图给你们看就会一目了然了。
用DEBUG的D命令得出这样的效果:
|---------->0B1F就是"楼房"------>段地址
|
| |------>右边的就是"单元号"--->偏移地址
| |
| ||-------->这部分就是"门户号"----->变地址
| ||<------------------------------------------>|
0B1F:0100 00 80 FF 02 75 05 C6 46-00 00 C3 E8 8C EB B4 3B
0B1F:0110 CD 21 72 39 8B FA 33 C0-8B C8 49 26 34 00 0E 0B
'
'
'
[省略]
看完这个图之后,是不是就很明了呢?但是聪明的人就会有疑问,那我们怎么走进"门户号(家)"呢?问得好,所以了为了可以走进"门户号(家)",就出现了一个叫做"寻址方式"的概念!说白了,就是教你如何找到这个"门户号(家)".呵呵!
好现在都明白了吗?那你们就看看我是怎么理解PC的寻址方式(通俗易懂):
在这我就只介绍比较难理解的:
1:寄存器直接寻址:
你就想成:其实你已经站在你要找的"门户号(家)"面前了,直接敲门进去就OK了!
例子: MOV AX,[2000H]
MOV AX,2000H -->2000H为存放操作数单元号的符号地址
上面两者是不等效的
2:寄存器间接寻址方式:
你就想成:你已经站在你要找的"门户号(家)"的"单元号",你要找到它,必须知道它在当前"单元号"几楼.假如它在6楼,那你就上到6楼就OK了!!注意,最高只有16楼,因为什么呢?那就用DEBUG的D命令看看呀,慢慢数哦,呵呵!!
例子: MOV AX,[BX]
计算公式: 物理地址=16d*(DS)+(BX)
物理地址=16d*(DS)+(SI)
物理地址=16d*(DS)+(DI)
物理地址=16d*(SS)+(BP)
3:寄存器相对寻址方式:
你就想成:你要找的"门户号(家)"其实就在你家的楼上或者楼下,你要找到它,就 必须知道它在你楼上几楼,或者在楼下几楼!就OK了!
例子: MOV AX,COUNT[SI]
MOV AX,[COUNT+SI]
其中 COUNT为位移量的符号地址
计算公式: 物理地址=16d*(DS)+(BX)+8位位移量
或+(SI) 或 16位位偏移量
或+(DI)
物理地址=16d*(SS)+(BP)+8位偏移量
4:基址变址寻址方式:
你就想成:你要找的"门户号(家)"是跟住在同一栋楼的不同"单元号",你要找到它,就必须知道它是该栋的哪个"单元号",并且住在几楼!那样你就可以找到它了 !
例子: MOV AX,[BX][DI]
MOV AX,[BX+DI]
计算公式: 物理地址=16d*(DS)+(BX)+(SI)
或+(DI)
物理地址=16d*(SS)+(BP)+(SI)
或+(DI)
5:相对基址变址寻址方式:
你就旁粗想成:你就想成:你要找的"门户号(家)"是跟住在同一栋楼的不同"单元号",它比你高几层楼或者低几层楼,然后用的你目前的楼数+/-就可以得出你要找的住在几楼了!
例子: MOV,AX,MASK[BX][SI]
MOV,AX,MASK[BX+SI]
MOV,AX,[MASK+BX+SI]
以上三个例子是等效的!!
计算公式: 物理地址=16d*(DS)+(BX)+(SI)+8位位移量
或+(DI) 或 16位位偏移量
物理地址=16d*(SS)+(BP)+(SI)+8位位移量
或+(DI) 或 16位位偏移量
---------------------------------------------------------------------
呵呵,终于写完了这篇教程,好累哦!! 是不是觉得我的思维很另类呀,要创新呀!
书上太理论了,我就创新一个,不知道你们看得懂吗?
呵呵,反正你们不要!@##)(#$*!@(@我就行了,我很努力写了!!!
下面,我举个程序例子,让你们加深印象!!!
----------------------------------------------------------------------
编程步骤:
1: 建立缓冲区,为输入字符串(最多能输入9个)
2: 取缓冲区的首地址,以便后面进行"寄存器间接寻址方式"
3: 利用"寄存器间接寻址方式"取得实际输入字符个数,以便确认循环次数
4: 利用"寄存器间接寻址方式"输入字符串的最后一个字符
5: 利用LOOP指令和2号显示功能来进行倒着显示
----------------------------------------------------------------------
;程序功能:任意输入几个字符(最多能输入9个),按回车则倒着输出!
data segment
user_string db 10,0,10 dup(?)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea dx,user_string ;建立输入字符串缓冲区
mov ah,0ah
int 21h
xor si,si
xor bx,bx
mov bx,dx
mov cx,[bx+si+1] ;看这个就是"寄存器间接寻址方式"
xor ch,ch ;其目的就是取实际输入字符个数
mov di,cx
lop: mov ah,2
mov dx,[bx+di+1];看这又是"寄存器间接寻址方式"
int 21h ;其目的就是取输入字符串的最后一个字符
dec di
loop lop ;依次循环倒着输出字符
mov ah,4ch
int 21h
code ends
end start
80x86寻址方式计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统计算机中的指令由操作码字段和操作数字段两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数指令的格式一般是:操作码,操作数…操作数操作数字段可以有一个、两个或三个搜索,通常称为一地址、二地址或三地址指令计算机只能识别二进制代码,所以机器指令是由二进制代码组成的,汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应的
1、与数据有关的寻址方式这种寻址方式用来确定操作数地址从而找到操作数(1)立即寻址方式操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。(2)寄存器寻址方式操作数在寄存器中,指令指定寄存器号除了上述两种寻址方式外,以下各种寻址方式的操作数都在除代码段以外的存储区中,通过不同的寻址方式求得操作数地址,从而取得操作数。操作数地址是由段基地址和偏移地址相加而取得的。段基地址在实模式和保护模式下可以从不同途径取得。在80x86里,把操作数的偏移地址称为有效地址(EA),下述各种寻址方式即为求得有效地址(EA)的不同途径有效地址可以由以下四种成分组成:位移量是存放在指令中的一个8位、16位或32位的数,但它不是一个立即数,而是一个地址基址是存放在基址寄存器中的内容,它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址变址是存放在变址寄存器中的内容,它通常用来访问数组中的某个元素或字符串中的某个字符比例因子是386及其后续机型新增加的寻址方式中的一个术语,其值可以是1,2,4或8。在寻址中,可用变址寄存器中的内容乘以比例因子来取得变址值有效地址的计算可以下式表示:EA=基址+(变址*比例因子)+位移量16位寻址时有效地址四种成分的组成:位移量:0,8,16位基址寄存器:BX,BP变址寄存器:SI,DI比例因子:无32位寻址时有效地址四种成分的组成:位移量:0,8,16,32位基址寄存器:任何32位通用寄存器变址寄存器:除ESP以外的32位通用寄存器比例因子:1,2,4,8各种访存类型下所对应的段的默认选择:指令:代码段,CS寄存器,用于取指堆栈:堆栈段,SS寄存器,所有的堆栈的进栈和出栈,任何用ESP或EBP作为基址寄存器的访存局部数据:数据段,DS寄存器,除相对于堆栈以及串处理指令的目的串以外的所有数据访问目的串:附加数据段,ES寄存器,串处理指令的目的串实际上,在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段(3)亩察键直接寻址方式操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值即操作数的有效地址80x86中为了使指令字不要过长,规定双操作数指令的两个操作数中,只能由一个用存储器寻址方式,这就是一个变量常常先要送到寄存器的原因(4)寄存器间接寻址方式操作数的有效地址只包含基址寄存器内容或变址寄存器内容一种成分。有效地址就在某个存储器中,而操作数则在存储器中(5)直接没迅变址寻址方式操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和,有效地址由两部分组成(6)基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两种成分组成(7)相对基址变址寻址方式操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中指定的位移量之和,所以有效地址由三部分组成(8)比例变址寻址方式操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,所以有效地址由三部分组成(9)基址比例变址寻址方式操作数的有效地址是变址寄存器的内容乘以比例因子再加上基址寄存器的内容之和,所以有效地迅巧址由三种成分组成(10)相对基址比例变址寻址方式操作数的有效地址是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量之和,所以有效地址由四种成分组成
2、与转移地址有关的寻址方式这种寻址方式用来确定转移指令及CALL指令的转向地址(1)段内直接寻址转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和(2)段内间接寻址转向的有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的有效地址用来取代IP寄存器中的内容(3)段间直接寻址在指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作(4)段间间接寻址用存储器中的两个相继字的内容来取代IP和CS寄存器的原始内容,以达到段间转移的目的。这里,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得
相对基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(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]等是错误的,即所用寄存器不能在厅败“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。
这个很明显是直接寻址方式,BX是通用寄存器,在计算机储存地址时,作为基址寄存器,[1234H]位移量的值表示的是操作数单元的地址(偏移地址),DS=2000H是段地址,而实际是需要的是物理地址,而物理地址=16Dx段地址+偏移地址 。
这缓数里说一下:段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低四位一定是0,这样就可以规定段地址只取起始地址的高16位值,偏移地址是指在段内相对与起始地址的偏移量升哪告,计算物理地址 就是把段地址吵明左移4位加偏移地址。即(20000+1234)H=21234H。
“高高低低”是指5213H高八位和低八位。如AX有高八位字节AH 和低八位字节AL。
声明: 我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本站部分文字与图片资源来自于网络,转载是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:daokedao3713@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
本站内容仅供参考,不作为诊断及医疗依据,如有医疗需求,请务必前往正规医院就诊
祝由网所有文章及资料均为作者提供或网友推荐收集整理而来,仅供爱好者学习和研究使用,版权归原作者所有。
如本站内容有侵犯您的合法权益,请和我们取得联系,我们将立即改正或删除。
Copyright © 2022-2023 祝由师网 版权所有
邮箱:daokedao3713@qq.com