**
第七节更灵活的定位内存地址的方法
**
1.and和or指令:
And指令:逻辑与指令,按位进行与操作
Mov al,01100011B
And al,00111011B
执行后:al=00100011B
Or指令:逻辑或指令,按位进行或运算
mov al,01100011B
or al,00111011B
执行后:al=01111011B
2.以字符形式给出的数据
assume cs:code,ds:data
data segment
db 'unIX' ;"db 75H,6EH,49H,58H"
db 'foRK'
data ends
code segment
start:mov al,'a' ; "mov al,61H" a的ASCII码为61H
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
3.大小写转换的问题:
将datasg中的第一个字符串转化位大写,第二个字符串转化为小写。
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] ;将ASCII码从ds:bx所指向的单元中取出。
and al,11011111B ;第五个位置变为0,成为大写。
mov [bx],al
inc bx
loop s
mov bx,5
mov cx,11
s0: mov al,[bx]
or al,00100000B
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
4.[bx+idata]:
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
mov ax,[bx+200] 数字化描述:(ax)=((ds)*16+(bx)+200)
也可以写成:
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
5.用[bx+idata]的方式进行数组的处理:
在codesg中填写代码,将datasg中定义的第一个字符串转化为大写,第二个字符串小写
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC '
db 'MinIx '
datasg ends
codesg segment
start:
codesg ends
end start
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,0[bx]
and a1,11011111b
mov o[bx],al
mov al,5[bx]
or al,00100000b
mov 5[bx],al
inc bx
loop s
6.SI和DI:
Si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
用si和di实现将字符串”welcome to masm!”复制到它后面的数据区中
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '..............................'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s: mov ax,0[si]
mov 16[si],ax
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
7.[bx+si]和[bx+di]:
mov ax,[bx+si] //mov ax,[bx][si]
(ax)=((ds)*16+(bx)+(si))
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si的数值,段地址在ds中
8.[bx+si+idata]和[bx+di+idata]:
[bx+si+idata]偏移地址为(bx)+(si)+idata
mov ax,[bx+200+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
9.不同寻址方式的灵活应用:
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 '
datasg ends
codesg segment
start:
codesg ends
end start
将datasg中每个单词的头一个字母改为大写字母
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[bx+3]
and al,11011111b
mov [bx+3],al
add bx,16
loop s
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
将datasg(以上)的每个单词改为大写字母
在需要暂存数据的时候,我们都应该使用栈
stacksg segment 定义一个段,用来做栈段,容量为16个字节
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:mov push cx 将外层循环的cx值压栈
mov si,0
mov cx,3 内层循环次数
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx 从栈顶弹出原cx,恢复cx
loop s0 外层循环的loop将cx减1