汇编笔记4

第七章 更灵活的定位内存地址的方法

and 和 or 指令以及字母大小写转换

1
2
3
mov al,97         ;al = 'a'
and al,11011111b ;al = 'A' ,即将al中的内容转换为大写,若已是大写则不变
or al,00100000b ;a1 = 'a' ,即将al中的内容转换为小写,若已是小写则不变

原理就是利用andor的特性:

  • and:将操作对象的相应位设为0,其他位不变
  • or:将操作对象的相应位设为1,其他位不变

and al,11011111b中的第5位为0(位数从0开始数),相当于就是al-2^5=al-32; or al,00100000b同理

定位地址

首先,寄存器sidibx功能类似,是16位寄存器,但不能分为两个8位寄存器来使用(即bx有bh和bl,而si和di就没有)

这3个寄存器共同利用起来就像是高级语言循环中层层循环中的i,j,k那样

寻址方式灵活运用

1

多重循环的实现

总的思路就是,因为只有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