一、and 和 or 指令
and 指令:逻辑与指令,按位进行与运算(有 0 得 0,全 1 得 1)
mov al,01100011B and al,00111011B 结果:00100011B
or 指令:逻辑或指令,按位进行或运算(有 1 得 1,全 0 得 0)
mov al,01100011B and al,00111011B 结果:01111011B
二、以字符形式给出的数据
我们可以在汇编程序中,用 ‘’ 的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的 ASCII 码
data segment db 'unIX' ;相当于 db 75H,6EH,49H,58H db 'foRK' data ends code segment start: mov al,'a' ;相当于 mov al,61H mov bl,'b' mov ax,4c00h int 21h code ends end start
三、大小写转换的问题
在ASCII码中,小写字母的对应范围为:61H - 7AH。大写字母的对应范围为:41H - 5AH。可见同一个字母的大写形式的ASCII码比小写形式的ASCII码小20H。
仔细观察大小写字母所对应的ASCII吗二进制形式,可以发现如下规律:大写字母从右数第6位(从1开始计算)全为0,小写字母从右数第6位全为1。
综上我们可以总结出大小写转换的两种方式:
字母大小写转换方式1:
- 大写字母加上20h可转换为小写字母。
- 小写字母减去20h可转换为大写字母。
字母大小写转换方式2:
- 字母转大写:逻辑与11011111B。
- 字母转小写:逻辑或00100000B。
datasg segment db 'BaSiC' ;转大写 db 'iNfOrMaTiOn' ;转小写 datasg ends codesg segment start: mov ax,datasg ;设置 ds 指向 datasg 段 mov ds,ax mov bx,0 ;设置(bx)=0,ds:bx 指向'Basic'的第一个字母 mov cx,5 ;设置循环次数5,因为'Basic'有5个字母 s: mov al,[bx] ;将 ASCII 码从 ds:bx 所指向的单元中取出 and al,11011111B ;与运算转大写 mov [bx],al ;值重新送入 bx 中 inc bx ;+1 指向下一个字符 loop s mov bx,5 ;设置 (bx)=5,ds:bx 指向'iNfOrMaTion'的第一个字母 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
四、[bx+idata]
这是一种"变量+常量"的寻址方式
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
mov ax, [bx+200]
表示将一个内存单元的内容送入ax,这个内存单元的长度为2个字节(字单元),存放一个字,偏移地址为bx中的数值加上200,段地址在ds中
该指令的常用格式有:
mov ax, [bx+200] mov ax, 200[bx] mov ax, [bx].200
五、SI 和 DI
它俩的功能与 bx 相近
SI和DI不能够分成两个8位寄存器来使用
;(1) mov bx,0 mov ax,[bx] ;(2) mov si,0 mov ax,[si] ;(3) mov di,0 mov ax,[di]
六、[bx+si] 和 [bx+di]
这是一种“变量+变量”的寻址方式
常用指令格式:
mov ax, [bx+si] mov ax, [bx][si]
七、[bx+si+idata] 和 [bx+di+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
八、不同的寻址方式的灵活应用
总结一下前面讲到的几种定位内存地址的方法(寻址方式):
(1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元;
(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;
(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
(4)[bx+si]用两个变量表示地址;
(5)[bx+si+idata]用两个变量和一个常量表示地址。