疯狂的暑假学习之 汇编入门学习笔记 (十四)—— 直接定址表
参考: 《汇编语言》 王爽 第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
我们还可以在直接定址表中存储子程序的地址,从而方便的实现不同子程序的调用。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』