(十五)SI 和 DI的多种使用方法--汇编笔记

汇编语言

Posted by YiMiTuMi on March 25, 2020

SI 和 DI

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

例:实现功能相同

mov bx, 0

mov ax, [bx]


mov si, 0

mov ax, [si]


mov di, 0

mov ax, [di]

例2:实现功能相同

mov bx, 0

mov ax, [bx + 123]


mov si, 0

mov ax, [si + 123]


mov di, 0

mov ax, [di + 123]

例3:用si和di实现将字符传“welcome to masm!” 复制到它后面的数据区中。(一个字符为一个字节)

assume cs:code, ds:data

data segment 

	db 'welcome to masm!'
	db '0000000000000000'

data ends

code segment

	start:	mov ax, data
			mov ds, ax
		
			mov si, 0
			mov di, 16
			mov cx, 8
	
		s: 	mov ax, [si]  //用了16位,一次传送2个字符
			mov [di], ax
			
			add si, 2
			add di, 2
			loop s

			mov ax, 4c00H
			int 21H
code ends

end start

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

例4:用[bx(si或di) + idata] 实现上面的程序。

assume cs:code, ds:data
	
data segment 
	
	db 'welcome to masm!'
	db '0000000000000000'
	
data ends	

code segment

	start:  mov ax, data
			mov ds, ax
	
			mov si, 0
			mov cx, 8
		
		s:  mov ax, [si]    //mov ax, 0[si]
			mov [si + 16], ax  //mov 16[si], ax
			add si, 2
			loop s
		
			mov ax, 4c00H
			int 21H

code ends

end start

[bx + si] 和 [bx + di]

[bx + si][bx + di] 的含义相似。

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

mov ax, [bx + si]

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

 (ax)= ((ds)* 16 + (bx) + (si))

该指令也可以协程如下格式(常用):

mov ax, [bx][si]

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

[bx + si + idata][bx + di + idata]两者的含义相似。

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

mov ax, [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

麦杆菊 – 永恒的记忆