什么是源变址寄存器?可以形象点介绍吗?

如题所述

在学汇编时,很多初学者对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
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-12-22
在8086中 源变址寄存器有两个 分别为 SI 和 DI
这两个寄存器一般是用在 基址变址寻址和相对基址变址寻址 这两种寻址方式中

也就是说 有效地址要由一个基址寄存器和一个变址寻址寄存器一起来确定

(基址寄存器 也有两个 BX 和 BP)

例如 mov al,[bx+si]本回答被提问者采纳

什么是源变址寄存器?可以形象点介绍吗?
但是,我可以这样比喻:内存就是有很多栋“楼房”,“楼房”又是由“单元号”,“门户号”组成,那“楼房”就相当于内存地址的段地址,“单元号”就相当于内存的的 偏移地址,“门户号(家)”就相当于“变地址”,而每个单元有16个"门户号(家)",又当我们找到"门户号(家)"后,走进这个"门户号(家...

什么是基址寄存器,什么是源变址寄存器,什么是目的变址寄存器?他们的功 ...
1、SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;2、DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。;3、BX叫做基址寄存器,用来存放操作数或中间结果,以减少对存储器的访问次数。数情况下,数据寄存器被用在算术或者逻辑指令运算中进行算术...

汇编语言中SIDI的作用是什么
1、SI是源变址寄存器,称为源变址寄存器,用于存放源操作数的偏移地址,并且SI的内容有自动修改的功能。2、DI是目的寄存器,称为目的变址寄存器,用于存放目的操作数的偏移地址,并且DI的内容有自动修改的功能。

什么是变址寄存器?有什么作用?试举例说明。
变址寄存器V和Z是16位数据寄存器,它在应用指令中用来修改操作对象的元件号。将V和Z的组合可进行32位的运算,此时,V作高16位,Z作低16位。下例中假定Z的值为4,则: K2X0Z=K2X4 K1Y0Z=K1Y4 K4M10Z=K4M14 K2S5Z=K2S9 D5Z=D9 T6Z=T10 C7Z=C11 ...

di,si是什么寄存器?
SI 源变址寄存器 用于存放源串操作数的偏移地址,DI 目标变址寄存器 一般用于存放目标操作说当前附加段中某个地址的偏移地址。

微机[SI][DI]什么意思
SI是源变址寄存器,DI是目的变址寄存器。1234H,这是一个立即数。为了将立即数寻址方式与直接寻址区分就加了个[]比如,MOV AL,12H 就是将立即数12H传送给AL,这里的12H就是内容 MOV AL,[12H] 就是将地址为12H中的存储单元中的内容传送给AL。以上把12H换成SI,同理。

变址寄存器的介绍
变址寄存器是指寄存器ESI、EDI、SI和DI的寄存器,它们主要用于存放存储单元在段内的偏移量。

变址寄存器概述
ESI、EDI、SI和DI被称为变址寄存器,或称为IndexRegister。这些寄存器的主要功能是存储存储单元在段内的偏移量,它们为存储器操作数的寻址提供了多种可能,使得我们可以方便地采用不同的地址形式访问内存空间。尽管它们本质上是通用寄存器,但变址寄存器不可分割为8位的部分。除了作为存储地址的工具,它们...

汇编语言寄存器都叫什么
SI:源变址寄存器。DI:目的变址寄存器。IP:指令指针寄存器。CS:代码段寄存器。DS:数据段寄存器。SS:堆栈段寄存器。ES:附加段寄存器 。OF:溢出标志,操作数超出机器能表示的范围表示溢出,溢出时为1。SF:符号标志记录运算结果的符号,结果负时为1。ZF:零标志运算结果等于0时为1,否则为0。CF:...

关于通用寄存器中各寄存器含义的问题
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串...

相似回答