汇编语言(王爽版)学习笔记 第七章 更灵活的定位内存地址的方法(2)

7.7 SI和DI

si和di是8086CPU中和bx相似的16位寄存器,但是si和di不能分成两个8位的寄存器。
在这里插入图片描述

问题7.2

在这里插入图片描述

"welcome wo masm!"从偏移地址0开始存放长度为16个字节,所以,它后面的数据区的偏移地址为16,就是字符串所要存放的空间

assume cs:codesg,ds:datasg
datasg segment
	db 'welcome to masm!'
	db '................'
datasg ends

codesg segment
	start:mov ax,datasg
		mov ds,ax
		mov si,0		;si指向第一个字符串
		mov di,16		;di指向目的数据区
		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次。

问题7.3

在这里插入图片描述

assume cs:codesg,ds:datasg
datasg segment
	db 'welcome to masm!'
	db '................'
datasg ends

codesg segment
	start:mov ax,datasg
		mov ds,ax
		mov si,0		;si指向第一个字符串
		mov cx,8
	s:mov ax,[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]/[bx+di]这样的方式来指明一个内存单元。
[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si) (即bx中的数值加上si中的数值)

mov ax,[bx+si]的含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(一个字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。

指令mov ax,[bx+si]的数学化的描述为:(ax=(ds)*16+(bx)+(si))
该指令也可以写成如下格式:
mov ax,[bx][si]

问题7.4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


7.9 [bx+si+idata]和[bx+di+idata]

[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata (即bx中的数值加上si中的数值再加上idata)

mov ax,[bx+si+idata]的含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(一个字单元),存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。

指令mov ax,[bx+si]的数学化的描述为:(ax=(ds)*16+(bx)+(si)+idata)
该指令也可以写成如下格式:(以idata=200举例)
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

在这里插入图片描述
在这里插入图片描述

发布了112 篇原创文章 · 获赞 77 · 访问量 9579

猜你喜欢

转载自blog.csdn.net/weixin_43092232/article/details/105302119