and
mov al,01100011B
and al,00111011B
执行后结果:al=00100011B
or
mov al,01100011B
or al,00111011B
执行后结果:al=01111011B
在没有学习新命令之前,若要将一个大写字母转为小写字母,或者小写字母转为大写字母,可以用and和or来实现
2.在汇编中,用’….’的方式指名数据是以字符的形式给出的,编译器将把它们转化为相对应的ascii码
如:
db 'unIX' 相当于 db 75H,6EH,49H,58H, 'u','n','I','X'对应的ascii码是75H,6EH,49H,58H
mov al,'a' 相当于 mov al,61H,因为'a'的ascii码为61H
3.可以用[bx+idata]来表示一个内存单元
如
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
datasg段中有两个字符串,第一个起始地址为0,第二个起始地址为5,可以将这两个字符串看做两个数组
0[bx] 5[x] 等价于 C语言当中的 a[i] b[i]
4.si和di是8086CPU中和bx功能相近的寄存器,si和di不能分为两个8位寄存器来使用
如:
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '...............'
datasg ends
用si和di实现将字符串'welcome to masm!'复制到它后面的数据区
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
5.[bx+si]和[bx+di] 含义相似 [bx+si+idata]和[bx+di+idata]含义也相似
如:mov ax,[bx+si]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx的数值加上si的数值,段地址默认在ds中
另外的[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
6.几种定位内存地址的方法,又称寻址方式
(1)[idata]用一个常量来表示地址,可直接定位一个内存单元
(2)[bx]用一个寄存器中的内容来表示内存地址,可间接定位一个内存单元
(3)[bx+idata]用一个寄存器中的内容和一个常量的和来表示地址,可间接定位一个内存单元
(4)[bx+si]用一个两个寄存器中的数据的和表示地址
(5)[bx+si+idata]用两个寄存器中的数据和一个常量的和表示地址
7.编程 将datasg段中每个单词的前4个字母改为大写字母
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov cx,4
s1: push cx
mov si,3
mov cx,4
s2:mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s2
add bx,16
pop cx
loop s1
mov ax,4c00h
int 21h
codesg ends
end start