第七章 更灵活的定位内存地址的方法
and 和 or 指令以及字母大小写转换
1 2 3
| mov al,97 ;al = 'a' and al,11011111b ;al = 'A' ,即将al中的内容转换为大写,若已是大写则不变 or al,00100000b ;a1 = 'a' ,即将al中的内容转换为小写,若已是小写则不变
|
原理就是利用and和or的特性:
- and:将操作对象的相应位设为0,其他位不变
- or:将操作对象的相应位设为1,其他位不变
而and al,11011111b
中的第5位为0(位数从0开始数),相当于就是al-2^5=al-32; or al,00100000b
同理
定位地址
首先,寄存器si和di与bx功能类似,是16位寄存器,但不能分为两个8位寄存器来使用(即bx有bh和bl,而si和di就没有)
这3个寄存器共同利用起来就像是高级语言循环中层层循环中的i,j,k那样
寻址方式灵活运用

多重循环的实现
总的思路就是,因为只有1个cx循环计数的寄存器,所以外层循环的cx可以先存起来,存的地方:
内循环的cx正常赋值使用,当内循环结束后,再将存好的外层循环的cx值重新赋给cx进行外层循环的递减,判断
给个栗子(改变每个字符串的前4个字母):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| 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 bx,0 mov cx,4
s0: push cx ;栈存外层cx mov si,0 mov cx,4 s: ;内层循环 mov al,[3+bx+si] and al,11011111b mov [3+bx+si],al inc si loop s
add bx,16 pop cx ;取出外层循环cx loop s0
mov ax,4c00h int 21h codesg ends
end start
|
就这么多~
Comments