汇编语言 第十六章 直接定址表

16.1 描述了单元长度的标号

在代码段中使用标号 code、a、b、start、s 等来标记指令、数据、段的起始地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
assume cs:code
code segment
a: db 1,2,3.4,5,6,7,8
b: dw 0
start: mov si,offset a
mov bx,offest b
mov cx,8
s: mov al,cs:[si]
mov ah,0
add cs:[bx],ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start

还可以使用一种标号,标号后面没有 “:”,这种标号不但表示内存单元的地址,还表示了内存单元的长度,,即表示在此标号处的单元,是一个字节单元、还是子单元,还是双字单元。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
assume cs:code
code segment
a db 1,2,3.4,5,6,7,8
b dw 0
start: mov si,0
mov cx,8
s: mov al,a[si]
mov ah,0
add b,ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start

因为这种标号包含了对于但愿长度的描述,所以在指令中,它可以代表一个段中的内存单元。比如,对于程序中的 “b dw 0”:

1
2
3
mov ax,b  相当于 mov ax,cs:[8]
mov b,2 相当于 mov word ptr cs:[8],2
inc b 相当于 inc word ptr cs:[8]

这些指令中,标号 b 代表了一个内存单元,地址为 code:8,长度为两个字节。

使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。这种标号称为数据标号,标记了存储数据的单元的地址和长度。不同于仅仅表示地址的地址标号。

16.2 在其他段中使用数据标号

一般来说,不在代码段中定义数据,而是将数据定义到其他段中。在其他段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。

在后面加有 “:” 的地址标号,只能在代码段中使用,不能在其他段中使用。

如果想在代码段中直接使用数据标号访问数据,则需要使用伪指令 assume 将标号所在的段和一个寄存器联系起来。否则编译器编译的时候,无法确定标号的段地址在哪。

16.3 直接定址表

编写子程序,以十六进制的形式在屏幕中间显示给定的字节型数据。

分析:一个字节用两个十六进制数码来表示。用一个字节的高 4 位和低 4 位分开,分别用它们的值得到对应的数码字符。比如 2Bh,可以得到高 4 位的值为 2,低 4 位的值为 11。

具体的做法是,建立一张表,表格依次存储字符 “0” ~ “F”,我们可以通过数值 0~15 直接查找到对应的字符。子程序如下:

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
;用 al 传送要显示的数据
showbyte: jmp short show
show db '0123456789ABCDEF' ;字符表
show: push bx
push es

mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1 ;右移 4 位,ah 中得到高 4 位的值
and al,00001111b ;al 中为低 4 位的值

mov bl,ah
mov bh,0
mov ah,table[bx] ;用高 4 位的值作为相对于 table 的偏移,取得对应的字符

mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah

mov bl,al
mov bh,0
mov al,table[bx] ;用低 4 位的值作为相对于 table 的偏移,取得对应的字符

mov es:[160*12+40*2+2],al

pop es
pop bx

ret

子程序中,在数值 0~15 中和字符 “0”~“F” 之间建立的映射关系位:以数值 N 为 table 表中的偏移,可以找到对应的字符。

利用查表的方式的目的有以下 3 个:为了算法的清晰和简洁;为了加快运算速度;为了使程序易于扩充。

16.4 程序入口地址的直接定址表

可以在直接定址表中存储子程序的地址,方便地实现不同子程序的调用。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×