找回密码
 register

QQ登录

只需一步,快速开始

查看: 32|回复: 0

[汇编语言] [零基础入门学习]·35·更灵活定位内存地址· SI和DI· [bx+si]和[bx+di]· [bx+si+idata]和[bx+di+idata]

[复制链接]

[汇编语言] [零基础入门学习]·35·更灵活定位内存地址· SI和DI· [bx+si]和[bx+di]· [bx+si+idata]和[bx+di+idata]

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2025-1-10 00:47 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

7.7 SI和DI

si 和 di 是 8086CPU 中和 bx 功能相近的寄存器

si 和 di 不能够分成两个 8 位寄存器来使用。下面的 3 组指令实现了相同的功能:

第一组指令

mov bx, 0
mov ax, [bx]

第二组指令

mov si, 0
mov ax, [si]

第三组指令

mov di, 0
mov ax, [di]

下面的 3 组指令也实现了相同的功能:

第一组指令

mov bx, 0
mov ax, [bx+123]

第二组指令

mov si, 0
mov ax, [si+123]

第三组指令

mov di, 0
mov ax, [di+123]

问题7.2

用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 2

        mov ax,4c00h
        int 21h
codesg ends
end start

注意,在程序中,用16位寄存器进行内存单元之间的数据传送,依次复制2个字节,一共循环8次。

问题7.3

用更少的代码,实现问题7.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[si],ax
        add si,2
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

7.8 [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中的数值,段地址在ds中。

数学化的描述为:(ax)=((ds)*16+(bx)+(si))

改指令也可以写成如下格式(常用):
mov ax,[bx][si]

问题7.4

用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 ......
写出下面的程序执行后,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)=1001H;指令执行后(cx)=0060H。
add cx,[bx+di]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)=1002H;指令执行后(cx)=0606H。

7.9 [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

问题7.5

用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 6A 22 ......
写出下面的程序执行后,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 ax,[cx+2+si]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)+2=1003H;指令执行后(ax)=6A00H。
mov ax,[bx+2+si]
访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)+2=1004H;指令执行后(ax)=226AH。

您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-15 13:23 , Processed in 0.107359 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表