1. 什么是段前缀
出
现
在
访
问
内
存
单
元
的
指
令
中
,
用
于
显
式
地
指
明
内
存
单
元
的
段
地
址
的
“
d
s
:
”
、
“
c
s
:
”
、
“
s
s
:
”
或
“
e
s
:
”
,
在
汇
编
语
言
中
称
为
段
前
缀
。
出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀
2. 为什么要使用段前缀
在debug中我们可以使用mov al,[0] 实现将内存中ds:[0]字节中的数据传到al中
但是在汇编源程序中:
assume cs : code
code segment
mov al,[0]
mov ax,4c00h
int 21h
code ends
end
该段代码表示的却是将常数0送到al中!
在汇编源程序中:
mov al,[0] 表示:(al)=0,同mov al,0
mov al,ds:[0] 表示:(al)=((ds)*16+0)
mov al,[bx] 表示:(al)=((ds)*16+(bx))
mov al,ds:[bx] 表示:与mov al,[bx]相同
为了实现和debug中相同的功能,可以在[idata]前显式地写上段寄存器 :
assume cs : code
code segment
mov al,ds:[0]
mov ax,4c00h
int 21h
code ends
end
3. 段前缀的使用
问题:将内存ffff:0~ffff:b中的数据拷贝到0:200~0:20b单元中
思考:
0:200和0020:0是相等的,同理后面可以表示为0020:1 0020:2........而与之相对应的另一块内存是ffff:1 ffff:2....故可以使用同一个寄存器存放偏移地址
assume cs : code
code segment
mov ax,0ffffh
mov ds,ax ;第一段内存的段地址
mov ax,0020h
mov es,ax ;附加段寄存器 第二段内存的地址
mov bx,0
mov cx,12
s:mov dl,[bx] ;ds:bx 内容放入dl
mov es:[bx],dl ;dl内容放入es:bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end