更加灵活的定位内存地址方法三

我们比较一下能用到的几种定位内存地址的方法(可称为寻址方式),就可以发现有以下几种方式:

(1)[iata] 用一个常量来表示地址,可用于直接定位一个内存单元;

(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;

(3)[bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;

(4)[bx+si]和[bx+di]用两个变量表示地址;

(5)[bx+si+idata] 用两个变量和一个常量表示地址。

SI和DI是8086CPU中和bx功能相近的寄存器,但是SI和DI不能够分成两个8位寄存器来使用。

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

mov bx,0

mov ax,[bx]

mov si,0

mov ax,[si]

mov di,0

mov ax,[di]


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

mov bx,0

mov ax,[bx+123]

mov si,0

mov ax,[si+123]

mov di,0

mov ax,[di+123]


例题:用寄存器SI和DI实现将字符串‘welcome to masm!’复制到它后面的数据区中。

解析:汇编程序为:

assume cs:code,ds:data

data segment

db 'welcome to masm!' (一个字母占一个字节,偏移地址的宽度为10H)

db '................'

data ends

code segment

start:mov ax,data

mov ds,ax

mov si,0

mov cx,8H

s:mov ax,[si+0]

mov [si+10H],ax

add si,2

loop s

mov ax,4c00H

int 21H

code ends

end start

debug下该汇编程序内存初始结果为:


执行完程序后内存结果为:


例:用Debug查看内存,结果如下:s

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 ax,[bx+2+di]

解析:执行mov ax,[bx+2+si] 相当于:mov ax,[1002]

执行mov cx,[bx+2+si] 相当于:mov ax,[1003]

........

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容