《汇编语言(第三版)》王爽笔记(7)更灵活的定位内存地址的方法
第七章 更灵活的定位内存地址的方法
and指令:按位进行 ‘与’ 运算
eg
mov al, 01100011B
and al, 00111011B
结果为 al=00100011B
可以通过and运算将操作对象的相应位置0. 如希望al第3位(从0开始数)为0,则使用 and al, 11110111B
or指令:按位进行‘或’运算
举例略,可以通过该指令将运算对象的相应位置置1.
or al, 00000100B (将第2位置1)
ASCII编码:当我们在文本编辑器中敲下‘a’,计算机将其转成61H存储在内存的指定空间;文本编辑器从内存中取出61H,送入显卡的显存;工作在文本模式下的显卡,用ASCII码规则解释61H,驱动显示器,把‘a’送上屏幕。
在汇编程序中,我们用 ’ … ’ 指明数据以字符形式给出,编译器会自动将其转化为ASCII码。eg
db ‘unIX’ 相当于 db 75h, 6eh, 49h, 58h
大小写字母的ASCII码区别:转化为二进制后,小写字母第5位为1,大写字母第五位为0. 可以不需要判断,利用and和or指令进行大小写转换。
and al, 11011111B 转大写
or al, 00100000B 转小写
另一种取址方式:[bx+idata]
mov ax,[bx+200]
含义:将偏移地址为BX+200位置开始的两个内存单元中的内容赋给AX。
同样含义的其他写法:mov ax,[200+bx]
mov ax, 200[bx]
mov ax, [bx].200
[bx+idata]的取址方式为高级语言实现数组操作提供了便利机制。
SI和DI是8086中与BX功能相近的寄存器,但SI和DI不能分成两个8位寄存器使用。
更灵活的寻址方式:[bx+si], [bx+di]
mov ax, [bx+si]
另一种写法: mov ax, [bx] [si]
[bx+si+idata], [bx+di+idata]
mov ax, [bx+si+200]
别的写法:
mov ax, [200+bx+si]
mov ax, 200[bx][si]
mov ax, [bx] .200[si]
mov ax, [bx][si].200
写嵌套循环时,应在内层循环开始前保存外层循环的CX值,并在内层循环结束后将值重新赋给CX。避免因为重复使用CX导致循环混乱。
用哪个寄存器来暂存CX?寄存器只有14个,一旦程序比较复杂,尽量不要用寄存器暂存数据。考虑使用内存。 在数据段开辟一段空间,用于暂存数据。更复杂的情况下,暂存数据很多,需要记住数据的位置。一般情况下,需要暂存数据的时候,使用栈。
实验6
assume cs:codesg,ds:datasg,ss:stacksg
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,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx
mov si,0
mov cx,4
s:mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start