本文主要是介绍SI和DI寄存器的用途,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SI是源变址寄存器,DI是目的变址寄存器。可以用来存放数据、地址,功能类似、用法类似、一般使用哪个都可以。
但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用。
BP: 是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.
SIDI是8086CPU中和bx功能相近的寄存器,SIDI不能够分成两个8位寄存器来使用.
下面三组指令实现了相同的功能:
(1) mov bx,0
mov ax,[bx]
(2) mov si,0
mov ax,[si]
(3) mov di,0
mov ax,[di]
下面的三组指令也实现了相同的功能:
(1) mov bx,0
mov ax,[bx+123]
(2) mov si,0
mov ax,[si+123]
(3) mov di,0
mov ax,[di+123]
用寄存器SI和DI实现将字符串 'welcome to masm!' 复制到它后面的数据区中.
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '............................'
datasg ends
分析:
我们编写的程序大都是进行数据的处理,而数据在内存中存放,所以我们在处理数据之前首先要搞清楚数据存储在什么地方,也就是说数据的内存地址.现在我们要对datasg段中的数据进行复制,我们先来看以下要复制的数据在什么地方,
datasg:0,这是要进行复制的数据的地址.那么复制到那里去呢?它后面的数据区.'welcome to masm!'从偏移地址0开始存放,长度为16个字节,所以,他们后面的数据区的偏移地址为16,就是字符串所要存放的空间,清楚了地址之后,我们就可以进行处理了.我们的ds:si指向要复制的原始字符串,用ds:di指向复制的目的空间,然后一个循环来完成复制,
代码如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
注意在程序中, 我们用的16位寄存器进行内存单元之间的数据传送,一次复制2个字节,一共循环8次(si和di每次加2)
用更少的代码,实现:
分析:
我们可以利用[bx(si或di)+idata]的方式,来使程序变得简洁.如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 16[ax],ax
add si,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
[bx+si]和[bx+di]
在前面我们用[bx(si或di)]和[bx(si或di)+idata]的方式来指明一个内存单元,我们还可以用更为灵活的方式:[bx+si]和[bx+di].
[bx+si]和[bx+di]的含义相似,我们以[bx+si]为例进行讲解.
[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值).
我们看一下指令mov ax,[bx+si]的含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址后为bx中的数值加上 si中的数值,段地址在ds中.
数学化的描述为:(ax)=((ds)*16+(bx)+(si))
该指令也可以写成如下格式(常用):
mov ax,[bx][si]
用DEBUG查看内存:
d 2000:1000
写出下面的程序执行后,ax,bx,cx中的内容.
mov ax,2000H
mov ds,ax
mov bx,1000H
mov si,0
mov ax,[bx+si]
inc si
mov cx,[bx+si]
inc si
mov di,si
add cx,[bx+di]
分析
mov ax,[bx+si]
访问的字单元的段地址在 ds中,(ds)=2000H;偏移地址=(bx)+(si)=1000H;指令执行后(ax)=00BEH
mov cx,[bx+si]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)=1002H;指令执行后(cx)=0600H
add cx,[bx+di]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)=1002H;指令执行后(cx)=0606H
[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]的含义相似,我们以[bx+si+idata]为例进行讲解.
[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再
加上idata).
我们看一下指令mov ax,[bx+si+idata]的含义:
将一个内存单元的内容送入ax,这个内存单元长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值在加上idata,段地址在ds中.
数学化的描述为:(ax)=((ds)*16+(bx)+(si)+idata)
该指令也可以写成如下格式(常用):
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
用DEBUG查看内存:
d 2000:1000
写出下面的程序执行后,ax,bx,cx中的内容.
mov ax,2000H
mov ds,ax
mov bx,1000H
mov si,0
mov ax,[bx+2+si]
inc si
mov cx,[bx+2+si]
inc si
mov di,si
mov bx,[bx+2+di]
分析:
mov ax,[bx+2+si]
访问的字单元的段地址在ds中, (ds)=2000H;偏移地址=(bx)+(si)+2=1002H;指令执行后(ax)=0006H
mov cx,[bx+2+si]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)+2=1003H;指令执行后(cx)=6A00H
mov bx,[bx+2+di]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)+2=1004H;指令执行后(bx)=226AH
这篇关于SI和DI寄存器的用途的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!