×
嵌入式 > 技术百科 > 详情

汇编入门学习笔记 (十四)—— 直接定址表

发布时间:2020-06-15 发布时间:
|
疯狂的暑假学习之  汇编入门学习笔记 (十四)—— 直接定址表

 

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

 

1. 描述单元长度的标号

 

普通的标号:a,b

 

  1. assume cs:code  
  2.   
  3. code segment  
  4.     a:db 1,2,3,4,5,6,7,8  
  5.     b:dw 0  
  6. start:  
  7.     mov si,offset a  
  8.     mov di,offset b  
  9.       
  10.     mov ah,0  
  11.     mov cx,8  
  12. s:  
  13.     mov al,cs:[si]  
  14.     add cs:[di],ax  
  15.     inc si  
  16.     loop s  
  17.       
  18.     mov ax,4c00h  
  19.     int 21h  
  20.       
  21.     mov ax,4c00h  
  22.     int 21h  
  23. code ends  
  24.   
  25. end start  

 

 

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

 

  1. assume cs:code  
  2.   
  3. code segment  
  4.     a db 1,2,3,4,5,6,7,8  
  5.     b dw 0  
  6. start:  
  7.     mov si,offset a  
  8.       
  9.     mov ah,0  
  10.     mov cx,8  
  11. s:  
  12.     mov al,a[si]  
  13.     add b,ax  
  14.     inc si  
  15.     loop s  
  16.       
  17.     mov ax,4c00h  
  18.     int 21h  
  19.       
  20.     mov ax,4c00h  
  21.     int 21h  
  22. code ends  
  23.   
  24. 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

 

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     a db 1,2,3,4,5,6,7,8  
  5.     b dw 0  
  6. data ends  
  7.   
  8. code segment  
  9.       
  10. start:  
  11.     mov ax,data  
  12.     mov ds,ax  
  13.   
  14.     mov si,offset a  
  15.       
  16.     mov ah,0  
  17.     mov cx,8  
  18. s:  
  19.     mov al,a[si]  
  20.     add b,ax  
  21.     inc si  
  22.     loop s  
  23.       
  24.     mov ax,4c00h  
  25.     int 21h  
  26.       
  27.     mov ax,4c00h  
  28.     int 21h  
  29. code ends  
  30.   
  31. end start  

 

3. 直接定址表

 

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

 

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

 

  1. assume cs:code  
  2.   
  3. code segment  
  4. start:  
  5.     mov al,0eh  
  6.     call showbyte  
  7.       
  8.     mov ax,4c00h  
  9.     int 21h  
  10.       
  11. showbyte:  
  12.     jmp short show  
  13.       
  14.     table db '0123456789ABCDE'   ;字符表  
  15.   
  16. show:  
  17.     push bx  
  18.     push es  
  19.       
  20.     mov ah,al  
  21.     shr ah,1     ;右移4位,ah中保存 高4位,al中保存第4位  
  22.     shr ah,1  
  23.     shr ah,1  
  24.     shr ah,1  
  25.     and al,00001111b  
  26.       
  27.     mov bl,ah  
  28.     mov bh,0  
  29.     mov ah,table[bx]  
  30.       
  31.     mov bx,0b800h  
  32.     mov es,bx  
  33.     mov es:[160*12+40*2],ah  
  34.       
  35.     mov bl,al  
  36.     mov bh,0  
  37.     mov al,table[bx]  
  38.       
  39.     mov es:[160*12+40*2+2],al  
  40.       
  41.     pop es  
  42.     pop bx  
  43.       
  44.     ret  
  45.       
  46.       
  47. code ends  
  48.   
  49. end start  
 

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




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器