- 代码段的标号可以用来标记指令,段的起始地址
利用标号S
代码段的数据也可以用标号,这个例子我编译不通过,得在数据段才行
- 将a标号处8个字节数据累加,将结果存储在b标号处的字中
- 修改了一下程序放在数据段内,安利特别好用的指令
lea
直接复制标号就可以不用offset
assume cs:code,ds:data
data segment
db 20 dup(?)
a db 201,202,203,4,5,6,7,8
b dw 0
data ends
code segment
start:
mov ax,data
mov ds,ax
lea si,a
lea di,b
mov cx,8
xor ax,ax
s:mov al,ds:[si]
mov ah,0
add ds:[di],ax
inc si
loop s
mov ah,4ch
int 21h
code ends
end start
- 答案测试正确
- 简化程序
assume cs:code,ds:data
data segment
db 20 dup(?)
a db 201,202,203,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 ah,4ch
int 21h
code ends
end start
数据标号
- 数据标号标记了存储数据的单元的地址和长度
- 数据标号不同于仅表示地址的地址标号
b代表地址为code:28,长度为字的内存单元
- 测试一下确实区分了字和字节的单元长度
不能直接把标号复制到寄存器里错误原因下面分析了
- 字节型数据不能复制到AX寄存器中,字型可以
- 数据段要标好,不然直接跑飞了
地址编号只能在代码段使用
- 标号可以当作数据来定义,记录a和b的偏移地址
assume cs:code,ds:data
data segment
db 20 dup(?)
a db 201,202,203,4,5,6,7,8
b dw 2 dup(0)
G dw a,b
data ends
code segment
start:
mov ax,data
mov ds,ax
mov al,a
mov ax,b
mov ax,G
mov ah,4ch
int 21h
code ends
end start