本节学什么:前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元的地址。
在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法。
1.and和or
例子:mov al, 01100011B (63H)
and al, 00111011B (3b)
执行后
al = 00100011B (23)
or同理
用途:通过and指令可将操作对象的相应位设为0,其他位不变,如:
将al的第6位设为0:and al, 10111111B
将al的第7位设为0:and al, 01111111B
将al的第0位设为0:and al, 11111110B
通过or指令可将操作对象的相应位设为1,其他位不变,如:
将al的第6位设为1:or al, 01000000B
将al的第7位设为1:or al, 10000000B
将al的第0位设为1:or al, 00000001B
2.关于ASCII码
所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象,比如说,在ASCII编码方案中,用 61H 表示“a”,62H表示“b”。
分析一段代码:
assumeds:data
data segment
db 'unIX'db'foRK'
data ends
code segment
start:mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
“db ‘unIX’ ” 相当于“db 75H,6EH,49H,58H”, “u”、 “n”、 “I”、 “X”的ASCII码分别为75H、6EH、49H、58H;
“db ‘foRK’ ” 相当于“db 66H,6FH,52H,4BH”, “u”、 “n”、 “I”、 “X”的ASCII码分别为66H、6FH、52H、4BH;
注意:小写字母的ASCII码值比大写字母的ASCII码值大20H
例子大写字母转小写字母:
assumecs:codesg,ds:datasg
datasg segment
db'BaSiC'db'iNfOrMaTiOn'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax;设置ds指向datasg段
mov bx,0;设置(bx)=0,ds:bx指向“BaSiC”的第一个字母
mov cx,5;设置循环次数5,因为“BaSiC”的有5个字母
s:mov al,[bx];将ASCII码从ds:bx所指向的单元中取出
and al,11011111b;将al中的ASCII码的第5位置为0,变为大写字母
mov [bx],al;将转变后的ASCII码写回原单元
inc bx;(bx)加1,ds:bx指向下一个字母
loops