注册 登录
编程论坛 汇编论坛

汇编中用0a号功能输入,然后倒序输出,我写了一个程序,有错误,在输出乱码后有正确结果输出,这是什么问题,新手求教

qq471402415 发布于 2015-04-12 20:29, 4633 次点击
程序代码:
S1 SEGMENT
STRING DB 100,?,100 DUP(0)
S1 ENDS
S2 SEGMENT PARA STACK
   DW 100 DUP (?)
   TOP LABEL WORD
   S2 ENDS
S3 SEGMENT
ASSUME DS:S1,SS:S2 ,CS :S3
P PROC FAR
MOV AX,S1
MOV DS, AX
MOV AX ,S2
MOV SS,AX
LEA SP,TOP

LEA DX,STRING
MOV AH,0AH
INT 21H

LEA BX,STRING
MOV CX,STRING[1]
ADD BX,CX
ADD BX,1
L1:
MOV DL,[BX]
MOV AH,2H
INT 21H
DEC BX
LOOP L1
  mov ah ,4ch
   int 21H
   P   ENDP
   S3  ENDS
       END P


3 回复
#2
wmf20142015-04-13 10:27
这么古老的事还有人做?
从你描述的看,应该是输入字符结尾没计算好,根据0ah资料,string第一个字节是缓冲区最大容量,第二个字节才是实际输入字符数(不包含回车符),因此你的显示代码如下:
XOR cx,cx
mov cl,string[1]
Lea bx,string
add bx,cx
L1:
.//你的循环显示代码
.
Loop l1
#3
取名字2015-04-28 14:46
楼主的程序问题出在:
LEA BX,STRING
MOV CX,STRING[1]
ADD BX,CX
ADD BX,1
其中“MOV CX,STRING[1]”,你的本意是将实际输入的字符数放入CX中,但按DOS中断例程INT 21H的0AH功能设计,STRING缓冲区第2个字节存放实际输入的字符数,注意是“字节”,而你却将STRING[1]处的一个字存入了CX,即CX中存放的不是正确的实际输入字符数,从而之后“ADD BX,CX”“ADD BX,1”得到的也就不是最后一个字符的正确偏移地址,自然要输出一些乱码了。
以上的分析,希望能够帮到楼主!
1