一、
实例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的值,一般来说,当需要暂存数据的时候,我们都应该使用栈!