汇编语言程序输出的一直是乱码,求高手找错5
发布网友
发布时间:2023-10-10 22:49
我来回答
共2个回答
热心网友
时间:2024-11-11 05:26
楼主的程序,可以输入150个字符,却只留了50个字符的空间!
另外,输入的是一个一个的字节,排序的时候却用““字””来排序,逻辑上有错。
最后,显示字符串,其末尾,应该有"$",否则就要显示出乱码。
以前写过,现成的,可供参考:
;================================================
assume cs:code, ds:data
data segment
msg1 db 'Before sort: $'
crlf db 0dh, 0ah, '$'
msg2 db 'After sort : $'
;----------------------------------
BUFSIZE DB 50 ;最多可键入50个字符.
ACTLEN DB ? ;实际键入的字符数.
CHARS DB 50 DUP(20H) ;实际键入的字符从此开始存放.
data ends
;----------------------------------
code segment
MAIN PROC FAR ;主程序.
start:
mov ax, data
mov ds, ax
mov dx, offset msg1
mov ah, 9
int 21h
MOV DX, OFFSET BUFSIZE ;键入缓冲区起始偏移地址送DX
MOV AH, 0AH
INT 21H ;输入字符串并送入缓冲区.
;-----------------------
MOV CL, ACTLEN ;取得输入的字符数.
ADD CL, 0
JNZ ok ;长度不为零就去排序.
JMP EXIT_MAIN
;-----------------------
ok:
mov dx, offset crlf
mov ah, 9
int 21h
mov dx, offset msg2
mov ah, 9
int 21h
;-----------------------
CALL SORT ;调用排序子程序.
;-----------------------
XOR CX, CX
MOV CL, ACTLEN ;取得输入的字符数.
MOV DX, OFFSET CHARS ;输入的字符串起始地址送DX
MOV BX, DX ;将字符串首地址送BX
ADD BX, CX ;取到字符串尾地址.
MOV BYTE PTR [BX], '$' ;在字符串尾插$
MOV AH, 09H ;字符串显示功能.
INT 21H ;显示键入的字符串.
EXIT_MAIN:
mov ah, 4ch
int 21h ;返回DOS
MAIN ENDP ;主程序的末尾.
;----------------------------------
SORT PROC ;排序子程序.
XOR CX, CX
MOV CL, ACTLEN ;取得输入的字符数.
DEC CX
mov si, offset CHARS
s: push cx
mov di, si
inc di
s1: mov al, [si]
cmp al, [di]
jb jx
xchg al, [di]
mov [si], al
jx: inc di
loop s1
inc si
pop cx
loop s
RET ;子程序返回主程序.
SORT ENDP
;----------------------------------
code ends
end start
;================================================
程序中,小写的是排序部分,大写的是键入显示部分。
热心网友
时间:2024-11-11 05:26
comment /*
1、硬盘如此大,代码何必挤成一团
2、小写的指令令人更舒服一些
3、我不知道为什么要在NEXT2标号那里开始使用16位寄存器,也许是录入格式的要求?但现在我改成8位的了
4、masm ml.exe v6.14.8444 link.exe v5.60.339
5、输入测试串acbdeg,排序后返回gedcba
6、很无奈,知道的这个编辑器很不适合编辑代码,将就着看。
*/
DATA SEGMENT
MSG0 DB 0DH, 0AH, 'Please input a string:$'
MSG1 DB 0DH, 0AH, 'Before sort, the string is:$'
MSG2 DB 0DH, 0AH, 'After sort, the string returns:$'
BS DB 0DH, 0AH, '$'
BUFSIZE DB 150 ; 最多可键入150个字符
ACTLEN DB ? ; 实际键入的字符数
CHARS DB 150 DUP(20H), '$' ; 实际键入的字符从此开始存放
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC FAR
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET MSG0
MOV AH, 09H
INT 21H
MOV DX, OFFSET BUFSIZE ; 键入缓冲区起始偏移地址送DX
MOV AH, 0AH
INT 21H ; 输入字符串并送入缓冲区
MOV DX, OFFSET BS
MOV AH,09H
INT 21H
CALL SORT ;子程序作用是排序,具体的就是显示排序前和排序后的字符串
MOV AH,4CH ;调用返回DOS功能
INT 21H ;返回DOS
MAIN ENDP
;------------------------------------
SORT PROC
; 显示排序前的提示信息
MOV DX, OFFSET MSG1
MOV AH, 09H
INT 21H
; 显示输入的字符串集合
MOV CH, 0
MOV CL, ACTLEN
MOV DI, OFFSET CHARS
@@:
MOV DL, [DI]
MOV AH, 02H
INT 21H
INC DI
LOOP @b
; 显示排序后的提示信息
MOV DX, OFFSET MSG2
MOV AH, 09H
INT 21H
; 冒泡排序?
MOV CH, 0
MOV CL, ACTLEN
MOV SI, OFFSET CHARS
NEXT1:
MOV DI, SI
MOV BL, CL
NEXT2:
MOV AL, [DI]
INC DI
CMP AL, [DI]
JNC NEXT3 ; >= 则不处理,跳转继续比较
MOV DL, [DI] ; <
MOV [DI-1], DL
MOV [DI], AL ; 把最小的移到最右边
NEXT3:
DEC BL
JNZ NEXT2
DEC CL
JNZ NEXT1
; 显示排序的字符串集合,复制上面,老兄可写个宏或函数
; 使用09调用不能显示是因为两次显示重叠在一起了,如何解决自己琢磨吧
MOV CH, 0
MOV CL, ACTLEN
MOV DI, OFFSET CHARS
@@:
MOV DL, [DI]
MOV AH, 02H
INT 21H
INC DI
LOOP @b
RET
SORT ENDP
CODE ENDS
END MAIN追问谢谢,不过如果想让排序是按照abcd……的顺序,应该改哪里啊?你的这个我试过了,很好的。