汇编 ds与es 之间的问题

我写了这样一个小程序,assumecs:codecodesegmentstart:callcopyDivmovax,0movds,axmovwordptrds:[0],2... 我写了这样一个小程序,
assume cs:code
code segment
start:

call copyDiv

mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:2[0],0h

mov ax,1000h
mov bh,1
div bh

mov ah,4ch
int 21h

copyDiv:
mov ax,cs
mov ds,ax
mov si,d0

mov ax,0
mov es,ax
mov di,200h

mov cx,offset endd0-offset d0
cld
rep movsb
ret

d0:
jmp d0Srart
nfo db 'Error!$',0
d0Srart:
mov dx,offset nfo
mov ah,09h
int 21h

mov ah,4ch
int 21h
endd0:

code ends
end start

输出乱码
但是我知道错在
mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:2[0],0h
把ds改为es就一切正常了,

但是,,,,为什么?
展开
 我来答 举报
baitang3671b
2011-05-14 · TA获得超过5040个赞
知道大有可为答主
回答量:4421
采纳率:31%
帮助的人:1209万
展开全部
你的问题不在于ds和es的区别,而在于int21h的9号功能。
这个功能需要用到ds dx 指向需要显示的字符串,你前面改了ds,导致ds:dx指针的位置错误,指向了乱码,当然就显示乱码了。你改成用es后,ds没被破坏,显示就正确了。
你把这几句改一下试试:
mov dx,offset nfo
mov ah,09h
int 21h
改成
push cs
pop ds ;让ds和cs相同
mov dx,offset nfo
mov ah,09h
int 21h
更多追问追答
追问
你说的办法我试过了,,但是管用啊,,点反应都没得的
追答
assume cs:code
code segment
start:

call copyDiv

mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:2[0],0h

mov ax,1000h
mov bh,0
div bh

mov ah,4ch
int 21h

copyDiv:
mov ax,cs
mov ds,ax
mov si,offset d0

mov ax,0
mov es,ax
mov di,200h

mov cx,offset endd0-offset d0
cld
rep movsb
ret

d0:
call d0Srart
nfo db 'Error!$',0
d0Srart:
pop dx
push cs
pop ds
mov ah,09h
int 21h

mov ah,4ch
int 21h
endd0:

code ends
end start
夏莆辜上
2011-05-15
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
mov word ptr ds:[0],200h
mov word ptr ds:2[0],0h
把ds改为es就一切正常了
抢首赞 已赞过 已踩过<
你对这个回答的评价是?
评论 举报 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式