汇编学习笔记--更灵活的寻址方式

一、

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

你可能感兴趣的:(汇编学习笔记--更灵活的寻址方式)