更灵活的定位内存地址的方法
7.1 AND和OR指令
(1)and指令:逻辑与指令,按位进行与运算。通过该指令可以将操作对象的相应位设为0.
如:
将AL的第3位设为0:AND AL,11110111B
将AL的第0位设为0:AND AL,11111110B
(2)or指令:逻辑或指令,按位进行或运算。通过该指令可以将操作对象的相应位设为1.
如:
将AL的第3位设为0:AND AL,00001000B
将AL的第0位设为0:AND AL,00000001B
7.2关于ASCII码
7.3 以字符形式给出的数据
实例:
assume ds: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
DS=0B8E,所以程序从0B9E段开始,中间的部分为PSP段。
7.4 大小写转换的问题
assume cs: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 ;ds:bx指向'BaSiC'的第一个字母
mov cx,5 ;循环次数为5,'BaSiC'有5个字母
s:mov al,[bx] ;将ASCII码从ds:bx所指向的单元中取出
and al,11011111b ;将al中的ASCII码的第五位变为0,即变为大写字母
mov [bx],al ;将转变后的ASCII码写会原单元
inc bx ;(bx)+1,ds:bx指向下一个字母
loop s
mov bx,5 ;将(bx)设为5,ds:bx指向'iNfOrMaTiOn'的第一个字母
mov cx,11 ;设置循环次数11,因为'iNfOrMaTiOn'有11个字母
s0:mov al,[bx]
or al,00100000b ;将al中ASCII码的第五位设为1,变为小写字母
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
7.5 [bx+idata]
7.6 用[bx+idata]的方式进行数组的处理
assume cs: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 ;ds:bx指向'BaSiC'的第一个字母
mov cx,5 ;循环次数为5,'BaSiC'有5个字母
s:mov al,[bx] ;将ASCII码从ds:bx所指向的单元中取出
and al,11011111b ;将al中的ASCII码的第五位变为0,即变为大写字母
mov [bx],al ;将转变后的ASCII码写会原单元
mov al,[5+bx] ;定位第二个字符串
or al,00100000b
mov [5+bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
7.7 SI和DI
SI和DI是8086CPU中和BX功能相近的寄存器,SI和DI不能够分为两个8位寄存器来使用。
7.8 [bx+si]、[bx+di]
7.9 [bx+si+idata]、[bx+di+idata]
这两种为更灵活的寻址方式
7.10 不同寻址方式的灵活运用