第七章 更灵活定位内存地址
1、and指令:逻辑与指令,按位进行运算,通过and指令可将操作对象的相应位设为0,其他位不变,例:and al 10111111B。or指令:逻辑或指令,按位进行运算,通过or指令可将操作对象的相应位设为1,其他位不变,例:or al 01000000B。
2、用字母表示数据,例:‘a’。
3、小写转大写and al 11011111b。大写转小写or al 00100000b。
4、[bx+idata]形式实现数组:idata[bx]。
5、SI和DI寄存器:16位寄存器,但是不能够分为两个8位寄存器来使用。
6、16位寄存器进行内存单元之间的数据传送,一次复制两个字节。[bx][si]。
7、[bx+si+idata]和[bx+di+idata]。200[bx][si]、[bx][si].200。
8、在每次开始内层循环的时候,将外层循环的cx中的数值保存起来(用dx),在执行外层循环的loop指令前,再恢复外层循环的cx数值。但是dx被使用了。。。。
9、改进1:开辟内存空间临时存放cx的值。
10、改进2:栈。二重循环将第一层循环入栈保存
11、下一章将对寻址方式的问题进行更深入地探讨。之所以如此重视这个问题,是因为寻址方式的适当应用,使我们可以以更合理的结构来看待所要处理的数据。而为所要处理的看似杂乱的数据设计一种清晰的数据结构是程序设计的一个关键的问题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 assume cs:code,ds:data,ss:stack
2
3 data segment
4 db 'ibm '
5 db 'dec '
6 db 'dos '
7 db 'vax '
8 data ends
9
10 stack segment
11 dw 0,0,0,0,0,0,0,0 ;栈段存储临时数据
12 stack ends
13
14 code segment
15
16 start: mov ax,stack
17 mov ss,ax
18 mov sp,16
19 mov ax,data
20 mov ds,ax ;设置ds指向datasg段
21
22 mov bx,0 ;用bs定位行
23
24 mov cx,4
25 s0:push cx ;将外层循环的cx压栈
26 mov si,0 ;用si定位列
27 mov cx,3 ;cx设置内层循环的次数
28
29 s:mov al,[bx+si+3]
30 and al,11011111b
31 mov [bx+si+3],al
32
33 inc si
34 loop s ;此时cx已经为零
35
36 add bx,16
37 pop cx ;从栈顶弹出原cx的值,恢复cx
38 loop s0 ;外层循环的loop指令中将cx中的计数值减1
39
40 mov ax, 4c00h
41 int 21h
42
43 code ends
44
45 end start ;指明程序的入口在start处