读书人

输出乱码解决办法

发布时间: 2012-12-27 10:17:10 作者: rapoo

输出乱码

DATA segment
MAXLEN db 11
INPTLEN db ?
STR1 db 11 dup(0)
STR2 db 11 dup(0)

DATA ends
STACK1 SEGMENT STACK
dw 40hdup(0)
STACK1 ends
CODE segment

assume cs:CODE,ds:DATA,ss:STACK1
start:mov ax,DATA
mov ds,ax
lea dx,MAXLEN
mov ah,0ah

int 21h
call SHIYAN5
mov dl,0dh
mov ah,02h
int 21h

lea dx,STR2
mov ah,09h
int 21h
mov ah,4ch
int 21h

SHIYAN5 PROC
PUSHF
PUSH BX
PUSH CX
PUSH SI

PUSH DI
XOR CX,CX
MOV CL,INPTLEN
LEA SI,STR1
LEA DI,STR2

DEC SI
L1: INC SI
CMP BYTE PTR[SI],30H
JAE L2
JMP L6

L2: CMP BYTE PTR[SI],39H
JA L3
LOOP L1
L3: CMP BYTE PTR[SI],41H
JAE L4

JMP L6
L4: CMP BYTE PTR[SI],5AH
JA L6
L5: ADD BYTE PTR[SI],20H
L6: MOV BX,[SI]

MOV [DI],BX
INC DI
LOOP L1
LEA SI,STR2
CMP SI,DI

JB L7
MOV BYTE PTR[SI],'?'
L7: POP DI
POP SI
POP CX

POP BX
POPF
RET
SHIYAN5 ENDP
CODE ENDS
END start


我用debug调试后反汇编,可以看出STR2的偏移量为000D

输入字符串(如hello)后,可以用-d 000D 看出数据确实已经变为hello

可是输出却乱码
[最优解释]
不输出?debug 的 p 却可以,说明什么?你没有换行的操作(输入内容后只再次显示了个回车),所以后来的显示覆盖在了输入的上面,由于两者一样,就没能表现出来。
[其他解释]
你直接用DOS DEBUG?用dosbox试试。
[其他解释]
int21h 的 0ah 功能输出字符串时,要求字符串是以字符 '$' 结尾的,你没有添加这个字符到所输入的字符串的最后,所以输出内容就越界失控而致乱码了。
[其他解释]
引用:
你直接用DOS DEBUG?用dosbox试试。


我觉得和那个没什么关系吧,我回头试试
------其他解决方案--------------------


引用:
int21h 的 0ah 功能输出字符串时,要求字符串是以字符 '$' 结尾的,你没有添加这个字符到所输入的字符串的最后,所以输出内容就越界失控而致乱码了。


但我输入hello$的时候它直接不输出了。

需要debug调试P单步运行输入再输出才成功
[其他解释]
STR1 db 11 dup(0)
STR2 db 11 dup(0)
改成
STR1 db 11 dup(?)
STR2 db 11 dup(?)
你试试

读书人网 >汇编语言

热点推荐