汇编语言中,有一种编程方法:直接定址表
这种方法和高级语言,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时:
![](https://img-blog.csdn.net/20150210183310538?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjM4ODAxOTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当ah是1时:
![](https://img-blog.csdn.net/20150210183316497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjM4ODAxOTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)