第16章 直接定址表

我们之前一直都是使用标号来标记指令,数据,段的起始地址,比如,下面的程序是将code处的a标号处的8个数据累加,结果存储在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 bx,offset b
      mov cx,8
    s:mov al,cs:[si]
      mov ah,0
      add cs:[bx],ax
      inc si
      loop
      
      mov ax,4c00h
      int 21h
    code ends
 end start
 ```
 程序中的,code,a,b,start,s都是标号,豆鞋标号仅仅表示内存单元的地址
 
 我们其实还可以使用一种标号,这种标号不仅仅表示内存单元的地址,还表示了内存单元的长度,即表示标号处的单元,是一个字节还是一个字单元,还是双字单元。
 

assume cs:code

code segment

a db 1,2,3,4,5,6,7,8

b dw 0

start:mov si,0

mov cx,8

s:mov al,a[si]

mov ah,0

add b,ax

inc si

loop s

mov ax,4c00h

int 21h

code ends

end start

“`

上面的a,b后面都是标号,他们的后面都是没有‘:’他们同时表示内存地址和单元长度的标号。标号a,描述了地址code:0,从这个地址开始,以后的内存单元都是字节单元,而标号b描述了地址code:8,从这个地址开始,以后的内存单元都是字单元。

16.2在其他段中使用数据标号

一般来说,我们不在代码段中定义数据,而是将数据定义到其他的段中,在其他的段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度

注意:在后面加有':'的地址标号,只能在代码段中使用,不能在其他段中使用。

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,0
     mov cx,8
   s:mov al,a[si]
     mov ah,0
     add b,ax
     inc si
     loop s
     
     mov ax,4c00h
     int 21h
  code ends
end start

如果在代码中直接访问数据段的数据,需要使用伪指令assume将标号所在的段和一个段寄存器联系起来。

注意:seg操作符,功能是取得某一处标号的段地址

共有 0 条评论

Top