汇编语言-直接定址表

汇编语言-直接定址表

代码功能:
将a地址中的1~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 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,b        相当于  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

在其他段中使用数据标号

普通的后面带有“:”的标号,是只能定义在代码段的。数据标号可以用在其他段中。


下面代码是上面代码的改进版:

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  
  1. 如果想把ds:b 直接写成 b,就必须在assume 后加上 cs:data
  2. 如果把ds和b寄存联系起来,那么在代码中,必须设置 mov ax,data mov ds,ax
原文地址:https://www.cnblogs.com/AbeDay/p/5026850.html