描述了内存地址的标号

  1. code segment
  2. a:db 1,2,3,4
  3. b:dw 0
  4. start:mov si,offset a
  5. mov bx,offset b

描述了单元长度(字节、字…)的标号

  1. code segment
  2. a db 1,2,3,4,5,6,7,8
  3. b dw 0
  4. start:mov si,0
  5. mov al,a[si]
  6. mov ah,0
  7. 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:取得某一个标号的段地址

  1. <a name="ajGsh"></a>
  2. ### 直接定址表的应用(数组)
  3. - 编写子程序,以十六进制的形式在屏幕中间显示给定的byte型数据。
  4. ```cpp
  5. assume cs:code
  6. code segment
  7. start:mov al,0eh
  8. call showbyte
  9. mov ax,4c00h
  10. int 21h
  11. showbyte:
  12. jmp short show
  13. table db '0123456789ABCDEF' ;数组
  14. show:push bx
  15. push es
  16. mov ah,al
  17. shr ah,4
  18. and al,00001111b
  19. mov bl,ah
  20. mov bh,0
  21. mov ah,table[bx] ;偏移
  22. ;放入显存
  23. mov bx,0b800h
  24. mov es,bx
  25. mov es:[160*12+40*2],ah
  26. mov bl,al
  27. mov bh,0
  28. mov al,table[bx] ;偏移
  29. ;放入显存
  30. mov bx,0b800h
  31. mov es,bx
  32. mov es:[160*12+40*2+2],al
  33. pop es
  34. pop bx
  35. ret
  36. code ends
  37. 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 ;一个偏移地址占一个字单元

  1. call word ptr table[bx]

;ah传送功能,al传递颜色值

;(1)清屏(覆盖) sub1: push bx push cx push es

  1. mov bx,0b800h
  2. mov es,bx
  3. mov bx,0
  4. 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

  1. mov si,0b800h
  2. mov es,si
  3. mov ds,si
  4. mov si,160 ;ds:si指向第n+1
  5. mov di,0 ;es:di指向第n
  6. cld
  7. mov cx,24 ;复制24

sub4s:push cx mov cx,160 rep movsb pop cx loop sub4s

  1. mov cx,80 ;80个字符
  2. mov si,0

sub4s1:mov byte ptr es:[160*24+si],’ ‘ ;最后一行清空 add si,2 loop sub4s1

  1. pop ds
  2. pop es
  3. pop di
  4. pop si
  5. pop cx
  6. ret

```