一、
实例1:将字符串BaSiC全转换为大写,将iNForMaTIOn全转换为小写
assume cs:code,ds:data
data segment
db 'BaSiC'
db 'iNForMaTIOn'
data ends
code segment
start: mov ax,data
mov ds,ax ;初始化数据段段地址
mov bx,0
mov cx,5
s: and [bx],11011111B ;第6位置为0
inc bx
loop s
mov bx,5
mov cx,10
s0: or [bx],00100000B ;第6位置为1
inc bx
loop s0
mov ax,4c00h
int 21h
code ends
end start
对于置第六位为0,书上的写法与我的略有区别
我的写法: and [bx],11011111B ;第6位置为0
书中的写法:mov al,[bx]
and al,11011111B
mov [bx],al
对比可以看出,书中的写法考虑到了对内存的操作是字节操作,而我没有明显地指出这一点,但是程序也完成了同样的功能。
注意:在操作内存时一定要注意数据的长度
解释:可能由于and 的第二个操作数是一个字节,所以这里对内存的操作也是一个字节
二、si和di
si和di是和bx功能相近的寄存器,但是它们不能分为两个8位寄存器来使用。
它们同样支持以下方式来表示内存的偏移地址:
[si]、[di]、[si+idata]和data[di]
三、[bx+si]
我们还可以用[bx+si]或[bx+di]来表示内存,也可以写作[bx][si]
还支持[bx+si+idata]、[bx+idata+si]、[idata+bx+si]、idata[bx][si]、[bx].idata[si]、[bx][si].idata
注意:似乎bx总在si之前,si与di类似
四、
实例2:将data段的每个单词都改成大写
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
code segment
start: mov ax,data
mov ds,ax ;初始化数据段段地址
mov bx,0
mov cx,4 ;外层循环,循环次数为4,循环变量为bx
s: mov si,0
mov ax,cx ;两层循环,而每层循环都要用到cx,所以需要在进入第二层循环前需要将cx进行保存
mov cx,3 ;内层循环,循环次数为3,循环变量为si
s0: and [bx+si],0dfh ;第6位置为0
inc si
loop s0
mov cx,ax ;还原上一层保存的cx,注意保存的cx值不能被修改
add bx,16
loop s
mov ax,4c00h
int 21h
code ends
end start
在这个程序里,我们用ax来暂时存放cx的值,一般来说,当需要暂存数据的时候,我们都应该使用栈!
本文详细解析了内存操作中对特定位的修改方法,并通过实例展示了如何利用SI和DI寄存器进行高效的数据访问。同时,讨论了在不同场景下选择合适的数据结构的重要性。
8813

被折叠的 条评论
为什么被折叠?



