第七章 更灵活的定位内存地址的方法
7.1 and和or指令
and指令:逻辑与指令,按位进行与运算。
mov al, 01100011B
and al, 00111011B
执行后:al=00100011B即都为1才为1
or指令:逻辑或指令,按位进行或运算。
mov al, 01100011B
or al, 00111011B
执行后:al=01111011B 即只要有一个为1就为1
7.2 关于ASCII码
世界上有很多编码方案,有一种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用61H表示“a”,62H表示“b”。一种规则需要人们遵守才有意义。
在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。我们按下键盘的a键,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡上的显存中;工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,
61H被当作字符“a”,显卡驱动显示器,将字符“a”的图像画在屏幕上。我们可以看到,显卡在处理文本信息的时候,是按照ASCII码的规则进行的。这也就是说,如果我们要想在显示器上看到“a”,就要给显卡提供“a”的ASCIⅡ码,61H。如何提供?当然是写入显存中。
7.3 以字符形式给出的数据
汇编程序中,’……'指明数据以字符形式给出的,编译器将把他们转化为相对应的ASCII码
;汇编程序的字符操作
assume cs:code,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
end start
7.4 大小写转换的问题
A:65d 01000001
a:97d 01100001
and: 11011111
结果: 01000001
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]
; 如果(al)>61H,则为小写字母的ASCII码,则:sub al,20H
and al,11011111b ;小写变大写
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
7.5 用[bx+idata]的方式进行数组的处理
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,datasg
mov bx,0
mov cx,5
s: mov al,[bx]
add al,11011111b
mov [bx],al
mov al,[bx+5]
mov al,5[bx]
or al,00100000b
mov [bx+5],al
loop s
mov ax,4c00h
int 21h
codesg ends
end start
C语言版本
#include<stdio.h>
int main(){
char a[5] = "BaSiC";
char b[5] = "MinIX";
int i = 0;
do
{
a[i] = a[i] & 0xDF;
b[i] = b[i] | 0x20;
i++;
} while (i < 5);
printf("%s %s\n",a,b);
getchar();
return 0;
}
7.6 SI和DI
SI和DI是8086CPU中和bx功能相近的寄存器,且不能够分成两个8位寄存器来用
将 welcome to masm! 复制到datasg:10h~1fh
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!';16位
db '................'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,8
s: mov ax,[bx]
mov [bx+16],ax
; inc bx
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
7.7 不同的寻址方式的灵活应用
深入理解下列几种寻址方式:
- [idata]
- [bx]
- [bx+idata]
- [bx+si]
- [bx+si+idata]
[bx+idata]
:
; 将每一个单词的头一个字母改成大写字母
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: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[3+bx]
and al,11011111b
mov [3+bx],al
add bx,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
[bx+si]
:
; 将每一个单词的头一个字母改成大写字母
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4 ;设置外层循环计数值
s: mov dx,cx
mov si,0
mov cx,3 ;内层循环的次数
s0: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s0
add bx,16
mov cx,dx ;用dx存储的外围循环的计数值恢复cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
; 将每一个单词的头一个字母改成大写字母dx
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
dw 0
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4 ;设置外层循环计数值
s: mov ds:[40h],cx
mov si,0
mov cx,3 ;内层循环的次数
s0: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s0
add bx,16
mov cx,ds:[40h] ;用datasg:40h单元的值恢复cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
; 使用栈来暂时存储数据
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
stacksg segment
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: push 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
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
[bx+si+idata]
:
; 将每一个单词的前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,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s: push cx
mov si,0
mov cx,4
s0: mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s0
add bx,16
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start