目录
一、and和or指令
and为按位与运算,都是1则为1,否则为0
or为按位或运算,都是0则为0,否则为1
二、ASCII码
字符在计算机中是以编码的形式存在的,而如何编码就是一种规则,最常见的是ASCII码
如a的ASCII码为61H,b的ASCII码是62H
三、以字符形式给出的数据
用'……'的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码
如 mov al,'a' 相当于mov al,61H
四、大小写转换
已知:小写字母的ASCII码值比大写字母的ASCII码值大20H
所以要将大写转化为小写,只需将ASCII码值加上20H即可
存在的问题:转换前应判断字母是大写还是小写,但是目前还没有学判断指令(类似C语言中的if)
发现规律:就ASCII码的形式来看,除了第5位数外(位数从0开始),大小写字母的其它各位都一样,大写字母第5位为0,小写字母为1。
解决方法:用or和and
代码:
assume cs:codesg,ds:datasg
datasg segment
db 'BaSIC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,[bx]
and al,11011111B
mov [bx],al
inc bx
loop s //这里是将BaSIC转化为大写
mov bx,5
mov cx,11
s0: mov al,[bx]
or al,00100000B
mov [bx],al
loop s0 //将iNfOrMaTiOn转化为小写
mov ax,4c00h
int 21h
codese ends
end start
五、[bx+idata]
mov ax,[bx+200]
将 段地址为cs的值,偏移地址为bx+200的内存单元的值 赋值给ax
其它格式:
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
六、用[bx+idata]的方式进行数组的处理
问题:仍是大小写的转换
代码如下:(只有核心部分)
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,[bx]
and al,11011111b
mov [bx],al
mov al,[bx+5]
or al,0010000b
mov [bx+5],al
inc bx
loop s
七、SI和DI——和bx功能相近的寄存器
si和di是和bx功能相近的寄存器,区别是si和di不能分为两个8为寄存器。
例:mov si,0
mov ax,[si]
八、[bx+si]和[bx+di]
mov ax,[bx+si]
将 段地址为cs的值,偏移地址为bx+si的内存单元中的数值 赋值给ax
九、[bx+si+idata]和[bx+di+idata]
偏移地址为bx+di+idata
mov ax,[bx+si+idata]
将 段地址为cs的值,偏移地址为bx+si+idata的内存单元中的数值 赋值给ax
例:mov ax,[bx+si+200]
将 段地址为cs的值,偏移地址为bx+si+200的内存单元中的数值 赋值给ax
其它格式:
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
十、不同的寻址方式的灵活运用
问题1:将每个单词的首字母改为大写字母
assume cs:codesg,ds:datasg
datasg segment
db '1.file '
db '2.edit '
db '3.search '
db '4.view '
db '5.options '
db '6.help ' //注:定义了6个字符串,每个长度为16个字节
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[bx+3]
and al,11011111b
mov [bx+3],al
loop s
code ends
end start
问题2:将每个单词改为大写字母
由于有双层循环,而只有一个cx,所以将外层循环的cx值存放在另一个位置。
这个位置可以是另外一个寄存器,如dx。但是当程序复杂时,由于8086CPU只有几个寄存器可用,所以要考虑其他位置,即内存空间。
故以下代码将外层循环的cx值存放在CS:[40H]的空间里。
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
db 0
datasg ends
codesg segment
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s: mov ds:[40H],cx
mov si,0
mov cx,3
s0: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
loop s0
add bx,16
mov cx:ds:[40H]
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
但是!
需要保存多个数据时,需要记住数据放到了哪个单元中,这样程序容易混乱。
----->一般在需要暂存数据的时候,我们都应该用栈。
修改后的代码如下:
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s: push cx
mov si,0
mov cx,3
s0: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
loop s0
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start