汇编语言中,有一种编程方法:直接定址表
这种方法和高级语言,C语言中的数组有类似的思想,就是将参数编排在一起,然后通过数组名的调用,得到需要的数值
汇编语言中,带冒号的标号在程序中可以知道代码的位置,而不带冒号的标号可以在程序中找到代码位置的同时知道所表示的参数的大小
比如说:table db 0,这里的table就是一个不带冒号的标号,如果定位到这个标号,那么就知道这个标号后面的数值是db型的
这里还需要强调一下call指令的一种用法,call word ptr 内存单元地址
这个指令的作用可以写为:push IP
jmp word ptr 内存单元地址
这样,在用直接地址的方法时,就可以用call指令来定位表中存放的标号地址,调用子函数,下面的例程就是用call指令来实现对地址的定址方法
代码功能:用ah来确定调用的子函数的序号,第一个子函数是清屏的功能,第二个子函数是改变字体颜色的功能
代码:
assume cs:code
code segment
table dw sub1, sub2 ;用直接定址表进行地址的寻找
start: mov ah, 1 ;ah存放调用的函数的序号ah是0就调用sub1,ah是1就调用sub2
mov bl, ah
mov bh, 0
add bx, bx ;因为table是dw型的数据,所以要定址,必须要将定址的序列号乘以2
mov al, 2 ;al存放的是颜色值
call word ptr table[bx] ;这句就是call的用法,直接定址到标号处,直接调用标号的函数
mov ax, 4C00H
int 21H
sub1: push bx ;函数的作用是清屏
push cx
push es
push ax
mov bx, 0B800H
mov es, bx
mov bx, 0
mov cx, 2000
s1: mov byte ptr es:[bx], ' '
add bx, 2
loop s1
pop ax
pop es
pop cx
pop bx
ret
sub2: push ax ;函数的功能是改变字体的颜色
push es
push bx
push cx
mov bx, 0B800H
mov es, bx
mov bx, 1
mov cx, 2000
s2: and byte ptr es:[bx], 11111000B ;先将后三位用and运算清零
or byte ptr es:[bx], al ;用or运算将后三位用al替代
add bx, 2
loop s2
pop cx
pop bx
pop es
pop ax
ret
code ends
end start
当ah是0时:
当ah是1时: