描述了内存地址的标号
code segment
a:db 1,2,3,4
b:dw 0
start:mov si,offset a
mov bx,offset b
描述了单元长度(字节、字…)的标号
code segment
a db 1,2,3,4,5,6,7,8
b dw 0
start:mov si,0
mov al,a[si]
mov ah,0
add b,ax
- mov ax,b = mov ax,cs:[8]
- mov b,2 = mov word ptr cs:[8],2 ```cpp data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dd a,b data ends ;c处存储的两个双字型数据为标号a的偏移地址和段地址,标号b的偏移地址和段地址
data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dw offset a,seg a,offset b,seg b data ends ;seg:取得某一个标号的段地址
<a name="ajGsh"></a>
### 直接定址表的应用(数组)
- 编写子程序,以十六进制的形式在屏幕中间显示给定的byte型数据。
```cpp
assume cs:code
code segment
start:mov al,0eh
call showbyte
mov ax,4c00h
int 21h
showbyte:
jmp short show
table db '0123456789ABCDEF' ;数组
show:push bx
push es
mov ah,al
shr ah,4
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 bx,0b800h
mov es,bx
mov es:[160*12+40*2+2],al
pop es
pop bx
ret
code ends
end start
程序入口地址的直接定址表
- 实现子程序setscreen
- 清屏
- 设置前景色
- 设置背景色
- 向上滚动一行 ```cpp setscreen:jmp short set table dw sub1,sub2,sub3,sub4
set:push bx cm ah,3 ja sret mov bl,ah mov bh,0 add bx,bx ;一个偏移地址占一个字单元
call word ptr table[bx]
;ah传送功能,al传递颜色值
;(1)清屏(覆盖) sub1: push bx push cx push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,20000
sub1s:mov byte ptr es:[bx],’’;用空格覆盖原有字符 add bx,2 loop sub1s pop es pop cx pop bx ret
;(2)设置前景色 (修改属性) 0、1、2位 sub2:push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,20000
sub2s:and byte ptr es:[bx],11111000b or es:[bx],al ;后三位覆盖选定的颜色 add bx,2 loop sub2s pop es pop cx pop bx ret
;(3)设置背景色 (修改属性) 4、5、6位 sub3:push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,20000
sub3s:and byte ptr es:[bx],10001111b or es:[bx],al ;4、5、6位覆盖选定的颜色 add bx,2 loop sub3s pop es pop cx pop bx ret
;滚动,依次覆盖上一行 sub4:push cx push si push di push es push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160 ;ds:si指向第n+1行
mov di,0 ;es:di指向第n行
cld
mov cx,24 ;复制24行
sub4s:push cx mov cx,160 rep movsb pop cx loop sub4s
mov cx,80 ;80个字符
mov si,0
sub4s1:mov byte ptr es:[160*24+si],’ ‘ ;最后一行清空 add si,2 loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
```