SI和DI寄存器的用途

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值