7.1 ~ 7.10
《汇编语言(第3版)》7.1 ~ 7.10、《零基础入门学习汇编语言》P32 ~ 35
第七章 更灵活的定位内存地址的方法
7.1 and 和 or 指令
7.1.1 and 指令
逻辑与指令,按位进行与运算
- 结果 0 0 0 0 1 0 1 0 0 1 1 1
mov al,01100011B
and al,00111011B
al=00100011B # 执行后
and 指令的使用技巧:通过该指令可将操作对象的相应位设为 0,其他位不变。
例如
- 将 al 的第 6 位设为 0:and al,10111111B
- 将 al 的第 7 位设为 0:and al,01111111B
- 将 al 的第 0 位设为 0:and al,11111110B
7.1.2 or 指令
逻辑或指令,按位进行或运算
- 结果 0 0 0 0 1 1 1 0 1 1 1 1
mov al,01100011B
or al,00111011B
al=01111011B # 执行后
or 指令的功能:通过该指令可将操作对象的相应位设为 1,其他位不变 例如
- 将 al 的第 6 位设为 1:or al,01000000B
- 将 al 的第 7 位设为 1:or al,10000000B
- 将 al 的第 0 位设为 1:or al,00000001B
7.3 以字符形式给出的数据
我们可以在汇编程序中,用’……‘的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的 ASCII 码。
7.4 大小写转换的问题
在十进制 ASCII 码表上,小写字母比大写字母大 32(20H),例如小写 a 是 61H,大写 A 是 41H
一个字母,不管原来是大写还是小写
- 我们将它的第 5 位置 0,它就必须将变为大写字母;
- 将它的第 5 位置 1,它就必须变为小写字母。
大小写字母转换
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax # 设置 ds 指向 datasg 段
mov bx,0 # 设置 (bx)=0,ds:bx 指向“BaSiC”的第一个字母
mov cx,5 # 设置循环次数 5,因为“BaSiC”有 5 个字母
s:
mov al,[bx] # 将 ASCII 码从 ds:bx 所指向的单元中取出
and al,11011111b # 将 al 中的 ASCII 码的第 5 位置为 0,变为大写字母
mov [bx],al # 将转变后的 ASCII 码写回原单元
inc bx # (bx)加 1,ds:bx 指向下一个字母
loop s
mov bx,5 # 设置 (bx)=5,ds:bx 指向“iNfOrMaTiOn”的第一个字母
mov cx,11 # 设置循环次数 11,因为“iNfOrMaTiOn”有 11 个字母
s0:
mov al,[bx]
or al,00100000b # 将 al 中的 ASCII 码的第 5 位置为 0,变为小写字母
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
7.5 [bx+idata]
[bx+idata] 表示一个内存单元,它的偏移地址为 (bx)+idata(bx 中的数值加上 idata)。
指令 mov ax,[bx+200] 可写成如下格式
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
7.7 SI 和 DI
SI 和 DI 是 8086 CPU 中和 bx 功能相近的寄存器,但是 SI 和 DI 不能够分成两个 8 位寄存器来使用。
下面每两行的指令实现了相同的功能
指令一 | 指令二 | 指令三 |
---|---|---|
mov bx,0 | mov si,0 | mov di,0 |
mov ax,[bx] | mov ax,[si] | mov ax,[di] |
———— | ———— | ———— |
mov bx,0 | mov si,0 | mov di,0 |
mov ax,[bx+123] | mov ax,[si+123] | mov ax,[di+123] |
用 ds:si 指向要复制的原始字符串,用 ds:di 指向复制的目的空间,然后用一个循环来完成复制。
注意利用 [bx(si 或 di)+idata] 的方式,来使程序变得更简洁。例如将固定长度的一段字符串,复制到另一段空间,就可以用相对偏移地址的方式,少引用一个偏移地址寄存器。
7.10 不同的寻址方式的灵活应用
共有以下几种寻址方式
- [data] 用要给常量来表示地址,可用于直接定位一个内存单元;
- [bx] 用一个变量来表示内存地址,可用于间接定位一个内存单元;
- [bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
- [bx+si] 用两个变量表示地址;
- [bx+si+idata] 用两个变量和一个常量表示地址。