| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3415 人关注过本帖
标题:我写的一个简单的程序,但输出有乱码,哪位高手帮一下
只看楼主 加入收藏
moto专家
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-1
收藏
 问题点数:0 回复次数:11 
我写的一个简单的程序,但输出有乱码,哪位高手帮一下
统计一个16位二进制数中为1的位的个数  
DATA     SEGMENT
         DATA1 DW 1111111111000000B
DATA     ENDS
CODE     SEGMENT
         ASSUME CS:CODE,DS:DATA
START:   MOV AX,DATA
         MOV DS,AX
         MOV CX,0FH
         MOV BX,DATA1
         MOV DL,0
         
LOOPER:  RCL BX,1
         JNC EXIT
         INC DL
EXIT:    LOOP LOOPER
         CLC
STOP:    MOV AL,9
         CMP AL,DL
         JC LOOP1

         ADD DL,30H
         MOV AH,2
         INT 21H
LOOP1:   ADD DL,37H
         MOV AH,2
         INT 21H         
CODE  ENDS
END START
搜索更多相关主题的帖子: 乱码 输出 
2008-12-01 18:14
moto专家
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-1
收藏
得分:0 
小弟初学  请高手指教
2008-12-01 18:15
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
DATA     SEGMENT
         DATA1 DW 1111111111000000B
DATA     ENDS
CODE     SEGMENT
         ASSUME CS:CODE,DS:DATA
START:   MOV AX,DATA
         MOV DS,AX
         MOV CX,0FH
         MOV BX,DATA1
         MOV DL,0
         
LOOPER:  RCL BX,1
         JNC EXIT
         INC DL
EXIT:    LOOP LOOPER
         CLC
STOP:    MOV AL,9
         CMP AL,DL
         JC LOOP1

         ADD DL,30H
         MOV AH,2
         INT 21H
LOOP1:   ADD DL,37H
         MOV AH,2
         INT 21H
         mov ax,4c00h
         int 21h
CODE  ENDS
END START
2008-12-01 18:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
你得告诉操作系统 我的程序完了

还有 输出有问题~~~

10被打成a了 十以上处理一下
2008-12-01 18:18
moto专家
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-1
收藏
得分:0 
谢谢版主了  但我不懂为什么 还得请教一下
2008-12-01 18:20
moto专家
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-1
收藏
得分:0 
就是asc码转换时不懂  麻烦斑竹赐教
2008-12-01 18:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用moto专家在2008-12-1 18:20的发言:

谢谢版主了  但我不懂为什么 还得请教一下


你运行时是不是告诉你 非法指令………………之类的

因为汇编很低级 很多东西要自己做 这里 dos下的程序要告诉操作系统程序完了 说白了就是要有最后的那两句

不写出错
2008-12-01 18:24
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用moto专家在2008-12-1 18:22的发言:

就是asc码转换时不懂  麻烦斑竹赐教


偶有事 一会再说 你看看其他的类似的程序吧

偶很讨厌这个输出呵呵
2008-12-01 18:26
moto专家
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-1
收藏
得分:0 
好的 ,谢谢了
2008-12-01 18:27
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
二.Ascii码
  我发现实际上很多人无法理解Ascii 十六进制 二进制 ……这些乱其八糟的东西,在这里我觉得有必要讲述一下。
  ASCII 全称是 American Standard Code for Information Interchange美国信息交换标准码。起始于50年代后期,在1967年定案。ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。一般情况下我们使用的是8位的。一个字节也是8位的,因此正好能够将它们按照数字对字符一一对应起来。

  比如: mov al,25h (注意,是十六进制的25h) 然后将 al 直接输出,结果就是“%”。这就是简单的对应。额外的:

  十六进制 显示出来的字符
  30h                0
  31h                1
  32h                2
  33h                3
  34h                4
  35h                5
  36h                6
  37h                7
  38h                8
  39h                9

  就是说 mov al,31h 显示出来就是 “1”。如果还不明白,不妨动手实验下面的程序:(注意:.data 不是 .data? 字符串放在后者显示不出来)


.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm

.data
   buffer   db 31h,32h,33h,34h,35h,36h,37h,38h,0
.CODE
START:

   invoke StdOut,addr buffer
   invoke ExitProcess,0

end START


  需要注意的是不是所有的Ascii都是可见的,因此我们直接用记事本打开一个可执行文件时会看到很多乱码,比如我们使用记事本打开 D:\MASMPlus\Bin\CVTRES.exe 结果如下:

  

  而使用十六进制编辑软件ultraEdit打开这个文件,看到的就是:

   

  左边是按照十六进制表示的,右边是左边数值对应的Ascii,很多无法显示的Ascii都用“.”来表示了。可以看出来和用Notepad打开的看起来很“像”。

  观察上面那个十六进制对Ascii的表可以发现一点点“规律”,一个数字 N 加上30h之后显示出来就是这个数字。如果我们要按照十六进制显示 AL中的数值,就可以将Al的高4位加上30h显示一下,再按照同样的方式处理低4位。不过 0-9的数值和A-F的并不连续,这里需要特殊处理一下。下面的dos程序段就是这个原理(非常不幸的是Dos Box中,我们的conole程序无法直接调用int 21h).


;Input AL,Bl,No Output
ShowAL proc
             pusha
              mov  dl,al      ;保存AL
              mov  cl,04      
              shr  al,cl      ;AL高4位移至低4位
              mov  cx,02h     ;循环2次

Low4bit:     cmp  al,09
              jbe  larger     ;低4位超过9
              add  al,07
larger:      add  al,30h

              push  cx
             mov  bh,0h
             mov  cx,1h
              mov  ah,09h
              int  10h
              pop  cx
              
             add  shX,1
             call SetCur
             mov  al,dl      ;恢复保存
               and  al,0Fh
              loop  Low4bit
              popa
         ret
ShowAL   endp


  如果有兴趣的话,可以将这个程序改造为你自己的console的showal.
2008-12-01 20:10
快速回复:我写的一个简单的程序,但输出有乱码,哪位高手帮一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017211 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved