7.1 ~ 7.10

2020-03-22
2020-03-22
3 min read
Hits

  《汇编语言(第3版)》7.1 ~ 7.10、《零基础入门学习汇编语言》P32 ~ 35

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

7.1 and 和 or 指令

7.1.1 and 指令

  逻辑与指令,按位进行运算

  • -结果
    000
    010
    100
    111
mov al,01100011B
and al,00111011B
al=00100011B     # 执行后

  and 指令的使用技巧:通过该指令可将操作对象的相应位设为 0,其他位不变。

  例如

  1. 将 al 的第 6 位设为 0:and al,10111111B
  2. 将 al 的第 7 位设为 0:and al,01111111B
  3. 将 al 的第 0 位设为 0:and al,11111110B

7.1.2 or 指令

  逻辑或指令,按位进行或运算

  • -结果
    000
    011
    101
    111
mov al,01100011B
or al,00111011B
al=01111011B     # 执行后

  or 指令的功能:通过该指令可将操作对象的相应位设为 1,其他位不变 例如

  1. 将 al 的第 6 位设为 1:or al,01000000B
  2. 将 al 的第 7 位设为 1:or al,10000000B
  3. 将 al 的第 0 位设为 1:or al,00000001B

7.3 以字符形式给出的数据

  我们可以在汇编程序中,用’……‘的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的 ASCII 码。

7.4 大小写转换的问题

  在十进制 ASCII 码表上,小写字母比大写字母大 32(20H),例如小写 a 是 61H,大写 A 是 41H

  一个字母,不管原来是大写还是小写

  1. 我们将它的第 5 位置 0,它就必须将变为大写字母;
  2. 将它的第 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,0mov si,0mov di,0
mov ax,[bx]mov ax,[si]mov ax,[di]
————————————
mov bx,0mov si,0mov di,0
mov ax,[bx+123]mov ax,[si+123]mov ax,[di+123]

  用 ds:si 指向要复制的原始字符串,用 ds:di 指向复制的目的空间,然后用一个循环来完成复制。

  注意利用 [bx(si 或 di)+idata] 的方式,来使程序变得更简洁。例如将固定长度的一段字符串,复制到另一段空间,就可以用相对偏移地址的方式,少引用一个偏移地址寄存器。

7.10 不同的寻址方式的灵活应用

  共有以下几种寻址方式

  1. [data] 用要给常量来表示地址,可用于直接定位一个内存单元;
  2. [bx] 用一个变量来表示内存地址,可用于间接定位一个内存单元;
  3. [bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
  4. [bx+si] 用两个变量表示地址;
  5. [bx+si+idata] 用两个变量和一个常量表示地址。
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 8.1