汇编语言程序输出的一直是乱码,求高手找错

作者&投稿:坚彬 (若有异议请与网页底部的电邮联系)
汇编语言问题,输出了正确结果,但是下面还输出了许多乱码??~

string db "hello !$"
字符串漏了
结束字符

5是查群,如果要打印‘5’,请使用‘5’,而不是5!

楼主的程序,可以输入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
;================================================
程序中,小写的是排序部分,大写的是键入显示部分。

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


c语言题 编写程序输出下面图像(要求用嵌套的循环语句实现)。 1 21 32...
include "stdio.h"int main(int argv,char *argc[]){int i,j;for(i=0;i<5;i++){for(j=5-i;j>0;printf(" "),j--);for(j=i+1;j>0;printf("%d",j--));printf("\\n");}return 0; }运行结果:

编写程序,从键盘输入一行字符串,将其中的小写字母全部转换成大写字母...
实现该功能的吃语言具体代码如下:include <stdio.h> include <stdlib.h> include <string.h> int main(){ FILE *fp;int i=0;char str[100];printf("请输入字符串,并且以感叹号!结束:\\n");if((fp=fopen("test.txt","w"))==NULL)\/\/打开输出文件并使fp指向此文件 { printf("无法打开...

C语言编写程序输出一下图形(程序用循环实现)
5,4,3,2,1,这个用i来算就是:5-i,for ( j=0;j<5-i;j++ )那么程序就是:int i,j;for ( i=0;i<5;i++ ) \/\/每一次循环实现输出一行 { for ( j=0;j<5-i,j++ ) \/\/每执行一次循环输出一个星号,循环次数就是星号个数 printf("*");printf("\\n");} ...

用C语言编写程序,随机输出一个使用0~9是个数字组成无重复的七位数
include <stdio.h> include include <stdlib.h> define N 7 int main() { char number[N] = {0};int flag,num,i,j;srand((unsigned)time(NULL));for(i = 0; i < N; ++i) { num = rand()%10;flag = 1;for(j = 0; j < i && flag; ++j) { if(num + '0' == n...

c语言编写程序求数列1,3,3,3,5,5,5,5,5,7,7,7,7,7,7,7的第四十项?_百...
c语言编写程序求数列1,3,3,3,5,5,5,5,5,7,7,7,7,7,7,7的第四十项:解答如下:main(){ int i,n; i=1; n=40; while (n>=0){ n=n-i; i=i+2; } printf("%d",i);} 上面程序输出的i值就是第n项的z值。

用C语言编写程序,从键盘输入两个字符串,输出第一个字符串在第二个字 ...
include <stdio.h>int main(){ char str1[100],str2[100]; char *p,*p1,*p2; gets(str1); gets(str2); for(p=str1;*p!='\\0';p++) { for(p1=p;p2=str2;*p1==*p2;p1++,p2++); if(*p2=='\\0') { printf("%d",p-str1); return 0...

C语言程序设计中如何输出一个64位的整数
1、ANSI C99标准中并没有64位整数类型。但是,许多实际的编译器,都实现了对64位整数类型的支持。因为没有这方面的标准,所以具体的语法描述方式略有不同,一般Windows平台,用__int64的关键字,而Linux平台则使用long long的描述方法。2、有人做了测试,如下图所示:综合上图可以得出如下几点:a:long...

将汇编语言源程序翻译成机器语言目标程序的是什么
把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观。但是汇编出...

怎样用C语言编写一个程序输出一个红色的旗子
include <stdio.h>#include <windows.h>#define N 5 \/\/ N >= 2,旗子大小void printFlag();void printSpace(int n);void color(const unsigned short color1);int main(){ printFlag(); \/\/ 不清楚你的旗子形状,仅供参考 return 0;}void printFlag(){ int i = 0...

c语言编写程序:从键盘上输入4个实数,然后输出其中最大的一个?_百度知...
int main(){ int i,max,a[4];scanf("%d",&a[0]);max=a[0];for(i=1;i<4;i++){ scanf("%d",&a[i]);if(a[i]>max)max=a[i];} printf("最大值:%d ",max);printf("\\n");return 0;}

邙山区17738999487: 汇编程序,字符串反序输出,出来的结果总是乱码!急求大神指教!! -
员舒盐酸: DATA SEGMENT BUF DB 32 DB ? DB 32 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX LEA DX, BUF MOV AH, 0AH INT 21H MOV DL, 0DH MOV AH, 2 INT 21H ...

邙山区17738999487: 汇编程序,统计各类字符以字符串输出时出现乱码,求教大神?? -
员舒盐酸: ; MOV DL, BH MOV AH,02 INT 21H …… MOV DL,BL MOV AH,02 INT 21H …… MOV DL,DH MOV AH,02 INT 21H 楼主上面的程序,是想要直接显示 BH、BL、DH 的内容,这是不行的.在 DL 里面,必须存进去 ASCII 码,才能正常显示.看看我的百度空间,有许多显示的例程,可供参考.

邙山区17738999487: 汇编语言的输出问题,输出一堆乱码,为什么? -
员舒盐酸: 5是查群,如果要打印'5',请使用'5',而不是5!

邙山区17738999487: 汇编语言为什么输出一串字符串的前面有乱码 -
员舒盐酸: 我觉得是字符串的地址有问题.可能比原来的字符串提前了几个字符.

邙山区17738999487: masm5.0汇编问题:输出为乱码 -
员舒盐酸: 你这个语句的功能是输出字符串,但是你需要自己设置字符串的地址,DS:DX=字符串的地址,而且这个字符串还要以$结束.目前乱码是应该是指向了一个未知的地方导致的.下面的代码因为没有编译环境,因此未做验证,仅做参考 assume cs:cseg,ds:dseg dseg segment db 'test$' dseg ends cseg segment start:mov ax,dseg mov ds,ax mov dx,0 mov ah,9 int 21h cseg ends end start

邙山区17738999487: win32汇编的console程序能不能输出中文啊,我的是乱码 -
员舒盐酸: 可以,但字符串要分清是UNICODE还是ASC II.另外,你写的这个基本是DOS风格,完全不像windows程序.console通常用invoke StdOut,...("提示信息",13,10)这类型函数来输出,而很少用像C语言的print来输出.

邙山区17738999487: C语言程序设计,不论我代码是什么,只要输出有数字,就一定是乱七八糟的一大串乱码数字 -
员舒盐酸: 1. 可能是你的编程软件有问题2. 可能是你把c++(后缀.cpp)的代码弄在了c(后缀.c)里,改个后缀试试3. 可能是操作有误,去网上看教程吧

邙山区17738999487: C语言中写文件,为什么写出的是乱码呢,求大 -
员舒盐酸: fp=fopen("stud.dat","wb"); //你建立的是二进制文件,这种文件用记事本打开就是乱码,这是正常的.

邙山区17738999487: c语言,输出总是乱码 -
员舒盐酸: 没看懂你想做什么 scanf("%d",m); 不能这样输入m是一个数组,要一个元素一个元素的输入 例如 for(i = 0;i<M;i++) scanf("%d",&m[i]);同样 printf("%d ",n) 这样输出 也不对要一个一个的输出

邙山区17738999487: 运行程序时输出的中文是乱码,求助!!并且在运行时不能切换输入法!!! -
员舒盐酸: 不是乱码的.是程序.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网