第七章 更灵活的定位内存的方法
第七章 更灵活的定位内存地址的方法7.1 and和or指令
1.and逻辑与指令:按位进行与运算,格式:
and 要保存到的寄存器,操作值
如and al,01110110B表示将al中的内容与01110110B按位与,并保存在al中
由于
,就可以用该指令将对应位设为0(关闭位).在给定操作值(有时也叫掩码)时,将要设定为0的位填0,保持不变的位填1。
如将al的第0位设为0 and al,11111110B
2. or逻辑或指令:按位进行或运算,格式:
or 要保存到的寄存器,操作值
用法与and差不多,但用于设置对应位为1(打开位),其他为不变。
由于
,在给定操作的值时保持不变的位填0,要打开的位填1
7.2关于ASCII码
工作在文本模式下的显卡用ASCII码的规则解释显存中的内容
7.3~7.4处理大小写
1. 在源程序中,用'......'的方式指名数据以字符的形式给出
注意:一个字符占1Byte(汉字2Byte,ASCII字符占1Byte),应该用db来定义字符(串)常量。
2. 大小写字母的ASCII值的规律:
大写字母+20H=小写字母,小写字母-20H=大写字母
大写字母ASCII码第5位为0,小写字母第5位为1,则
转换为大写字母and al,11011111B
转换为小写字母or al,00100000B
7.5[bx+idata]、7.6用[bx+idata]的方式进行数组的处理
1.[bx+idata]表明一个内存单元偏移地址为(bx)+idata,段寄存器为ds
其他形式:[idata+bx]
idata[bx]
[bx].idtata
2.实例应用:将datasg中的第一个字符串转化为大写,第二个字符串转化为小写
Program 7-1-1 Assembly Language Version
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start:
mov ax,datasg
mov da,ax
mov bx,0
mov cx,5
s:mov al,0[bx]
and al,11011111B
mov 0[bx],al
mov al,5[bx]
or al,00100000b
mov 5[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
Program 7-1-2 C/C++ Version
char a[5]="BaSiC";
char b[5]="MinIX";
int main(void)
{
int i=0;
do
{
a[i]&=0xDF;
b[i]|=0x20;
i++;
}while(i<5);
}
7.7 SI和DI 7.8 [bx+si]和[bx+di] 7.9[bx+si+idata]和[bx+di+idata]
SI为源变址寄存器,DI为目标变址寄存器
SI和DI与bx功能和用法相近,但不能分为两个8位寄存器使用
使用时段地址默认在ds中
用法1: [SI] [DI] [SI+idata] [DI+idata]
用法2:[bx+si] [bx+di]
该用法将两个寄存器中的数据相加,得到要访问的内存单元。该用法的其他格式:
[bx][si] [bx][di]
用法3:[bx+si+idata] [bx+di+idata]
该用法将两个寄存器和一个常数相加,得到要访问的内存单元。该用法的其他格式:
[bx+idata+si] [idata+bx+si] idata[bx][si] [bx].idata[si] [bx][si].idata
7.10 不同寻址方式的灵活运用
1. 一般来说,在需要暂存数据时,都要使栈
2.多层循环计数问题:
在外层循环之前设置cx的值,在执行外层循环时将cx的值压入栈中,进入内层循环,设置cx,执行内层循环,结束内层循环后弹出cx原先在栈中保存的值,执行外层的循环,以此类推。
结构:
mov cx,first_loop;设置外层循环次数
s0:push cx;将外层循环次数用栈存储
mov cx,second_loop;设置内层循环次数
s:
......
loop s
pop cx;恢复外层循环的计数
loop s0
实验6 实践课程中的程序
编程,将datasg段中每个单词的前4个字母改为大写字母。)
Program ex-6-0
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:
mov ax,datasg
mov ds,ax ;ds=datasg
mov ax,stacksg
mov ss,ax ;ss=stacksg
mov sp,16 ;sp为栈顶,这里栈有16字节
mov cx,4
mov bx,0 ;初始为0,逐次加16
s: push cx ;备份cx cx=外层循环计数
mov cx,4 ;cx=内层循环计数
mov si,0
s0: mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al ;al &=11011111b
inc si
loop s0
;字符串可看作数组 char strs[][]
;bx为指向每个字符串的指针
;si为指向每个字符的指针
pop cx ;恢复外层的cx
add bx,16
loop s
mov ax,4c00h
int 21h
codesg ends
end start
