汇编语言-直接定址表
汇编语言-直接定址表
代码功能:
将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
- 如果想把ds:b 直接写成 b,就必须在assume 后加上 cs:data
- 如果把ds和b寄存联系起来,那么在代码中,必须设置
mov ax,data mov ds,ax