and和or指令
0代表假,1代表真。
and指令
逻辑与指令,按位进行与运算。有假则假。
0&0=0 , 0&1=0 , 1&1=1
通过and指令可将操作对象相应位设为0,其他位不变。
and al,11011111b 将al的第5位设为0
or指令
逻辑或指令,按位进行或运算。有真则真。
0|0=0 , 0|1=1 , 1|1=1
通过or指令可将操作对象的相应为设为1,其他位不变。
or al,00100000b 将al的第5位设为1
ASCII码
文本编辑过程中,包含着按照ASCII编码规则进行的编码和解码。按下键盘的a键,计算机用ASCII码的规则对按键的信息进行编码,将其转化位61H存储在内存的指定空间。
字符形式给出的数据
在汇编程序中,用’……'的方式指明数据是以字符形式给出的,编译器把它们转化为相应的ASCII码。
大小写转换
同一个字母的大小写ASCII码的十六进制相差20。A的ASCII码为01000001,a的ASCII码为01100001。大小写的区别就在于第五位,改变第五位的数字就可以转换大小写。
assume cs:code,ds:data
data segment
db 'MuSic'
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,5
x: mov al,[bx]
and al,11011111b ;将第5位二进制码改为
mov [bx],al ;0
inc bx
loop x
mov ax,4c00h
int 21h
code ends
end start
[bx+idata]
**[bx]可以用来指明一个内存单元,还可以用[bx+idata]**表示一个内存单元,它的偏移地址为(bx)+idata。
mov ax,[bx+200]
将一个内存单元中的内容送入ax,这个内存单元的段地址在ds中,偏移地址为bx中的数值加上200。
(ax)=((ds)*16+(bx)+200)
也可以写成
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
[bx+idata]的方式处理数组
将’MuSiC’ 'ReMiX’转化为一个大写一个小写。
assume cs:code,ds:data
data segment
db 'MuSiC'
db 'ReMiX'
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,5
x: mov al,[bx] ;第一个字符串中的字符
and al,11011111b
mov [bx],al
mov al,[bx+5] ;第二个字符串中的字符
or al,00100000b
mov [bx+5],al
inc bx
loop x
mov ax,4c00h
int 21h
code ends
end start
SI和DI
si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
mov bx,0
mov ax,[bx]
mov si,0
mov ax,[si]
mov di,0
mov ax,[di] ;三组指令功能相同
si和di也能够加上idata。
[bx+si]和[bx+di]
si和di可以用到偏移地址的表示。
[bx+si]和[bx+di]的含义相似。
[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)。
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。
(ax)=((ds)*16+(bx)+(si))
也可以用
mov ax,[bx][si]
来表示。
[bx+si+idata]和[bx+si+idata]
[bx+si+idata]和[bx+si+idata]的含义相似。
[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata。
将一个内存单元的内容送入ax,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。
(ax)=((ds)*16+(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
不同的寻址方式的灵活应用
几种定位内存地址的方法。
- [idata]用一个常量来表示地址,可用于直接定位一个内存单元。
- [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。
- [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。
- [bx+si]用两个变量表示地址。
- [bx+si+idata]用两个变量和一个常量表示地址。
当程序需要使用嵌套循环时,用内存单元或栈来保存外层循环的cx值,内存循环结束时,再把数值返回。
assume cs:code,ds:data,ss:stack
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
stack segment
dw 0,0,0,0,0,0,0,0 ;定义栈段
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,10h
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
x0: push cx ;定义行,把cx中的4入栈
mov si,0
mov cx,3
x: mov al,[bx+si] ;定义列的循环
and al,11011111b
mov [bx+si],al
inc si
loop x
pop cx ;4出栈,进行行的循环
add bx,10h
loop x0
mov ax,4c00h
int 21h
code ends
end start