汇编语言不带冒号标号的用法

汇编语言中,有一种编程方法:直接定址表

这种方法和高级语言,C语言中的数组有类似的思想,就是将参数编排在一起,然后通过数组名的调用,得到需要的数值

汇编语言中,带冒号的标号在程序中可以知道代码的位置,而不带冒号的标号可以在程序中找到代码位置的同时知道所表示的参数的大小

比如说:table db 0,这里的table就是一个不带冒号的标号,如果定位到这个标号,那么就知道这个标号后面的数值是db型的


这里还需要强调一下call指令的一种用法,call word ptr 内存单元地址

这个指令的作用可以写为:push IP

jmp word ptr 内存单元地址

这样,在用直接地址的方法时,就可以用call指令来定位表中存放的标号地址,调用子函数,下面的例程就是用call指令来实现对地址的定址方法

代码功能:用ah来确定调用的子函数的序号,第一个子函数是清屏的功能,第二个子函数是改变字体颜色的功能

代码:

[plain] view plain copy
  1. assume cs:code  
  2.   
  3. code segment  
  4.   
  5.     table dw sub1, sub2                                                                       ;用直接定址表进行地址的寻找  
  6.   
  7.     start:                                              mov ah, 1                ;ah存放调用的函数的序号ah是0就调用sub1,ah是1就调用sub2  
  8.                                                         mov bl, ah  
  9.                                                         mov bh, 0  
  10.                                                         add bx, bx                             ;因为table是dw型的数据,所以要定址,必须要将定址的***乘以2  
  11.                                                         mov al, 2                ;al存放的是颜色值  
  12.                                                         call word ptr table[bx]                ;这句就是call的用法,直接定址到标号处,直接调用标号的函数  
  13.                                                           
  14.                                                         mov ax, 4C00H  
  15.                                                         int 21H  
  16.                                                           
  17.                                         sub1:           push bx                                 ;函数的作用是清屏  
  18.                                                         push cx  
  19.                                                         push es  
  20.                                                         push ax  
  21.                                                           
  22.                                                         mov bx, 0B800H  
  23.                                                         mov es, bx  
  24.                                                           
  25.                                                         mov bx, 0  
  26.                                                         mov cx, 2000  
  27.                                                 s1:     mov byte ptr es:[bx], ' '  
  28.                                                         add bx, 2  
  29.                                                         loop s1  
  30.                                                           
  31.                                                         pop ax  
  32.                                                         pop es  
  33.                                                         pop cx  
  34.                                                         pop bx  
  35.                                                         ret  
  36.                                                           
  37.                                         sub2:           push ax                             ;函数的功能是改变字体的颜色  
  38.                                                         push es  
  39.                                                         push bx  
  40.                                                         push cx  
  41.                                                           
  42.                                                         mov bx, 0B800H  
  43.                                                         mov es, bx  
  44.                                                         mov bx, 1  
  45.                                                         mov cx, 2000  
  46.                                                 s2:     and byte ptr es:[bx], 11111000B      ;先将后三位用and运算清零  
  47.                                                         or byte ptr es:[bx], al              ;用or运算将后三位用al替代  
  48.                                                         add bx, 2  
  49.                                                         loop s2  
  50.                                                           
  51.                                                         pop cx  
  52.                                                         pop bx  
  53.                                                         pop es  
  54.                                                         pop ax  
  55.                                                         ret  
  56.                                                           
  57. code ends  
  58. end start  

当ah是0时:

汇编语言不带冒号标号的用法

当ah是1时:

汇编语言不带冒号标号的用法