8086汇编语言中的输出结果为什么会出现跳行或者多行一并输出的情况

[复制链接]
查看11 | 回复1 | 2011-5-7 03:37:36 | 显示全部楼层 |阅读模式
下面是程序,求高手解答!
datareasegment
msglengthdb25
Mynamedb\'20091695songyahui\',13,10,\'$\'
msg0db\'IlikeMyIBM-PC\',0dh,0ah
;\'IlikemyIBM-PC\'
msg1db\'Ilikemusic\',13,10
msg2db\'Mynameissnow\',13,10
msg3db\'Songyahuiismygirl\',13,10
msg4db\'IlikewatchingTV\',13,10
msg5db\'Ilikeplaying\',13,10
msg6db\'Iliketobethefirst\',13,10
msg7db\'Ilikequiet\',13,10
msg8db\'Iliketohaveawalk\',13,10
msg9db\'Ibelievemyself\',13,10
errmsgdb\'error!invalidparameterduiay\',13,10,\'$\'
promptmsgdb\'Pleaseinputaninteger(0-9):\',13,10,\'$\'
datareaends

stacksegment
db256dup(0)
toslabelword
stackends

prognamsegment
mainprocfar
assumecs:prognam,ds:datarea,ss:stack
start:
movax,stack
movss,ax
movsp,offsettos

pushds
subax,ax
pushax

movax,datarea
movds,ax

movdx,offsetmsg0
movah,9
int21h
calldispMyname
begin:

movdx,offsetpromptmsg
movah,9
int21h
movah,1
int21h
subal,\'0\'
jcerror
cmpal,9
jaerror
movbx,offsetmsg0
mulmsglength
addbx,ax
calldisplay
jmpbegin

error:movbx,offseterrmsg
calldisplay
ret

displayprocnear
movcx,30
disp1:movdl,[bx]
calldispchar
incbx
loopdisp1
movdl,0dh
calldispchar
movdl,0ah
calldispchar
ret
displayendp

dispMynameprocnear
pushax
pushdx
pushds
MOVAH,9
MOVDX,SEGMyname
MOVDS,DX
MOVDX,OFFSETMyname
Int21h
Popds
Popdx
Popax
ret
dispMynameendp

dispcharprocnear
movah,2
int21h
ret
dispcharendp

mainendp


prognamends
endstart
回复

使用道具 举报

千问 | 2011-5-7 03:37:36 | 显示全部楼层
第一:你得要保证你的每条信息都25字节,因为你的偏移地址是movbx,offsetmsg0
mulmsglength这两条指令得到也就是从msg0开始。。。所以你的每条的长度不都为25字符的话就会出现不对齐。。。
第二:还有一处displayprocnear
movcx,30;-----------注意此处,,你的的循环是30次。。就是从所得的偏移地址打30个字符。
所以综合下来。。你的问题所在就是两个原因造成的。。一是首先偏移地址不能准确定位。第一点的问题。二是你每次是循环打30个字符。。当打到每条最后13,10回车换行后还继续打满30个字符。所以就出现了又换行还打印了其他行的信息。。。
--------------------------
我给的建议是别用meg0去算偏移地址。。用查表来定位或用多分枝来定位。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行