汇编简单入门教程(十四)直接定址表


 

参考: 《汇编语言》 王爽 第16章

 

1. 描述单元长度的标号

 

普通的标号:a,b

 

assume cs:code

code segment
	a:db 1,2,3,4,5,6,7,8
	b:dw 0
start:
	mov si,offset a
	mov di,offset b
	
	mov ah,0
	mov cx,8
s:
	mov al,cs:[si]
	add cs:[di],ax
	inc si
	loop s
	
	mov ax,4c00h
	int 21h
	
	mov ax,4c00h
	int 21h
code ends

end start

 

 

仔细看一下,下面代码的标号的不同。下面的标号a、b后面没有冒号。它们是可以描述单元长度的标号。又叫数据标号

 

assume cs:code

code segment
	a db 1,2,3,4,5,6,7,8
	b dw 0
start:
	mov si,offset a
	
	mov ah,0
	mov cx,8
s:
	mov al,a[si]
	add b,ax
	inc si
	loop s
	
	mov ax,4c00h
	int 21h
	
	mov ax,4c00h
	int 21h
code ends

end start

 

我们可以:

mov ax,bx      相当于  mov ax,cs:[8]

mov b,2         相当于  mov word ptr cs:[8],2

inc b               相当于inc   word ptr cs:[8]

mov   al,a[si] 相当于 mov al,cs:0[si]

mov al,a[3]    相当于mov al,cs:0[3]

 

但是下面的是错的

mov al,b  因为b是dw,字型的

add  b,al

 

2. 在其他段中使用数据标号

 

 

普通的后面带有“:”的标号,是只能定义在代码段的。数据标号可以用在其他段中。

 

例子:注意如果想把ds:b 直接写成 b,就必须在assume 后加上 cs:data

 

assume cs:code,ds:data

data segment
	a db 1,2,3,4,5,6,7,8
	b dw 0
data ends

code segment
	
start:
	mov ax,data
	mov ds,ax

	mov si,offset a
	
	mov ah,0
	mov cx,8
s:
	mov al,a[si]
	add b,ax
	inc si
	loop s
	
	mov ax,4c00h
	int 21h
	
	mov ax,4c00h
	int 21h
code ends

end start

 

 

 

3. 直接定址表

 

我们可以建一个表,用查表的方式来大大加快处理速度。

 

例子:在屏幕显示对应16进制数字的字符。这里字符就用来一个表。

 

assume cs:code

code segment
start:
	mov al,0eh
	call showbyte
	
	mov ax,4c00h
	int 21h
	
showbyte:
	jmp short show
	
	table db '0123456789ABCDE'   ;字符表

show:
	push bx
	push es
	
	mov ah,al
	shr ah,1     ;右移4位,ah中保存 高4位,al中保存第4位
	shr ah,1
	shr ah,1
	shr ah,1
	and al,00001111b
	
	mov bl,ah
	mov bh,0
	mov ah,table[bx]
	
	mov bx,0b800h
	mov es,bx
	mov es:[160*12+40*2],ah
	
	mov bl,al
	mov bh,0
	mov al,table[bx]
	
	mov es:[160*12+40*2+2],al
	
	pop es
	pop bx
	
	ret
	
	
code ends

end start

 

 

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






  • yanyang

    评论: 测试一下文章 :)

    2016-07-12 11:25:27          回复