CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  扩充话题 >  程序人生

急急急!!!!请教汇编一题

楼主wuhaiping(一)2003-06-03 11:55:53 在 扩充话题 / 程序人生 提问

编写一程序,要求从键盘接收一个四位十六进制数,并在终端上显示与他等值的二进制数`  
  date   segment  
  date   ends  
  stack   segment   stack    
                    db   120   dup(0)  
  stack   ends  
  code   segment  
  main   proc   far  
                assume   ds:date,ss:stack,cs:code  
  start:  
                push   ds  
                sub   ax  
                push   ax  
   
                mov   ah,1  
                int   21h  
            //sub   al,30h  
                cmp   al,0ah  
                jl   L1  
                sub   al,7h//这四句我不要结果也一样  
  L1:            
                mov   cl,4             ;把低四位循环为高四位,以用于下面的四次循环  
                sal   al,cl  
                mov   ch,4             ;循环计数器  
                mov   cl,1             ;循环左移的1次  
  rotate:  
                rol   al,cl  
                jc   next  
                mov   dl,30h         ;如果cf=0输出0的十六进制30h  
                jmp   L2  
  next:  
                mov   dl,31h         ;为1输出1的十六进制31h  
  L2:  
                mov   ah,2             ;2号输出  
                int   21h  
                dec   ch                 ;计数器自减1  
                cmp   ch,0             ;比较是否结束循环  
                jne   ratate  
                 
                ret  
  main   endp  
  code   ends  
              end  
   
   
  我们老师说我们用的是很旧的版本,前面的东东必写,我也不知什么该写什么不该写,全写上了。  
  我这编译能编译通过,但每次输入一个数总是输出0000  
  我们老师刚从研究生毕业一年,啥都不会,连书上的程序都看不懂,我请他帮我看过程序,他说一句自己看,  
   
  我反思了这个程序,我觉得可能我对数字在内存中的存储方式不懂。比如在键盘上输入一个十进制数,他是用ASC2还是压缩的十六进制存储,是不是计算机在帮我们转换?  
   
  我们用的书是清华大学的《IBM-PC汇编语言和程序设计》第二版编著沈美明,温冬婵 问题点数:100、回复次数:17Top

1 楼deadog(死狗不死)回复于 2003-06-03 12:12:36 得分 0

up.Top

2 楼nik_Amis(...)回复于 2003-06-03 12:25:36 得分 0

。。。。。Top

3 楼bethrezen(拖泥)回复于 2003-06-03 12:44:51 得分 0

upTop

4 楼dunkel(内心和夜 哪个黑)回复于 2003-06-03 12:50:07 得分 0

版主替楼主转到汇编版去吧.Top

5 楼chenzhangf(寒剑文)回复于 2003-06-03 12:52:53 得分 0

贴错地方了.Top

6 楼pds9902(双)回复于 2003-06-03 14:34:47 得分 100

楼主,你算是遇到好人了!  
  呵呵,好人?不就是我啰?!  
   
  看了你的程序,帮你调试了一下,   你的问题是出在了每次调用2号输出的时候,al的值都会改变,它会变成你输入的在dl中的值.即总在30H,31H两个中变化.  
   
  你只要在调用2号输出时将ax进栈,调用完后将ax出栈即可!!!  
  具体程序如下(我把你定义的堆栈去掉了我认为不需要定义那么长的堆栈):  
  date   segment  
  date   ends  
  code   segment  
  main   proc   far  
                assume   ds:date,cs:code  
  start:  
                push   ds  
                mov   ax,date  
                mov   ds,ax;置有效的数据段  
                sub   ax,ax;此处置ax=0  
                push   ax  
   
                mov   ah,1  
                int   21h  
                sub   al,30h  
                cmp   al,0ah  
                jl   L1  
                sub   al,7h;这四句很重要,0-9的asii是30h-39h,A-F的asii是41h-46h,中间隔了07h  
                                  ;所以当输入0-9时减30h,输入A-F时,减37h  
  L1:            
                mov   cl,4     ;把低四位循环为高四位,以用于下面的四次循环  
                sal   al,cl      
                mov   ch,4     ;循环计数器  
                mov   cl,1     ;循环左移的1次  
  rotate:  
                rol   al,cl  
                jc   next  
                push   ax             ;此处进栈  
                mov   dl,30h       ;   如果cf=0输出0的十六进制30h  
                jmp   L2  
  next:  
                push   ax             ;此处进栈  
                mov   dl,31h       ;   为1输出1的十六进制31h  
  L2:  
                mov   ah,2           ;   2号输出  
                int   21h  
                pop   ax               ;此处出栈  
                dec   ch                 ;计数器自减1  
                cmp   ch,0             ;比较是否结束循环  
                jne   rotate  
                 
                ret  
  main   endp  
  code   ends  
              end  
   
  程序成功运行,呵呵Top

7 楼wuhaiping(一)回复于 2003-06-04 15:44:12 得分 0

多谢仁兄指点  
  我想知为什么al会变  
  小弟刚学请不要见笑Top

8 楼wuhaiping(一)回复于 2003-06-04 15:49:38 得分 0

mov   ds,ax;置有效的数据段  
  sub   ax,ax;此处置ax=0  
  push   ax  
  这三句我知是和ret一起用,  
  但我不知为什么ax=0再压栈  
  Top

9 楼wuhaiping(一)回复于 2003-06-04 15:51:09 得分 0

汇编论坛在那儿,我找不找Top

10 楼pds9902(双)回复于 2003-06-04 16:05:02 得分 0

>>我想知为什么al会变  
  mov   dl,待输出的字符  
  mov   ah,2            
  int   21h  
  以上是在屏幕上输出dl中的字符,成功则al=输出的字符;  
   
   
  push   ds  
  mov   ax,date  
  mov   ds,ax;置有效的数据段  
  sub   ax,ax;此处置ax=0  
  push   ax  
   
  以上五句最好写成:  
   
  push   ds               ;保存ds  
  push   ax               ;保存ax   ->以上两句不要也可以,但习惯上写上  
  mov   ax,date  
  mov   ds,ax;置有效的数据段  
  sub   ax,ax;此处置ax=0  
   
                 
   
                 
   
   
   
  Top

11 楼dunkel(内心和夜 哪个黑)回复于 2003-06-04 18:55:22 得分 0

"汇编语言"   在   "开发语言"   里.Top

12 楼wuhaiping(一)回复于 2003-06-05 15:42:42 得分 0

pds9902(双):  
  我前天又有一题不能运行能否再帮一个忙,  
  冒泡排序的子程序调用。  
  data   segment  
                  num     dw   5,8,5,16,84,32  
                  save_cnt   dw   ?  
                  start_addr   dw   ?  
  data   ends  
  stack   segment   stack  
                            db   120   dup(0)  
  stack   ends  
  code   segment  
  main   proc   far  
                  assume   ds:data,ss:stack,cs:code  
   
  start:  
                  push   ds  
                  sub   ax,ax  
                  push   ax  
   
                  mov   ax,   data  
                  mov   ds,ax  
   
                  mov   di,num  
                  call   bubble  
                  mov   cx,[di]  
  L1:  
                  add   di,2  
                  mov   dx,   [di]  
                  mov   ah,2  
                  int   21h  
                  loop   L1  
                  ret  
  main   endp  
  bubble   proc   near  
                  mov   start_addr,di  
                  mov   cx,[di]  
                  mov   save_cnt,cx  
  init:  
                  mov   bx,1  
                  mov   ax,save_cnt  
                  dec   ax  
                  mov   save_cnt,ax  
                  jz   sorted  
                  mov   cx,save_cnt  
                  mov   di,start_addr  
  next:  
                  add   di,2  
                  mov   ax,[di]  
                  cmp   [di+2],ax  
                  jae   cont  
                  xchg   [di+2],ax  
                  mov   [di],ax  
                  sub   bx,bx  
  cont:  
                  loop   next  
                  cmp   bx,0  
                  je   init  
  sorted:  
                mov   di,start_addr  
                ret  
  bubble   endp  
  code   ends  
              end   start  
  我不知子程序调用是否与普通程序一样编译和联接  
  masm   程序名.asm  
  默认三个回车生成.obj文件,  
  link   程序名.obj  
  默认三个回车生成.exe文件,  
  执行.exe  
  程序出来一行……module[.obj]:我也记不清前面是什么?  
  关于那个stack   segment   stack   我们学校的机子必须要,不然报错说stack   error.  
  Top

13 楼ttty()回复于 2003-06-05 15:56:09 得分 0

upTop

14 楼lovehululu(夜晚熊熊燃烧)回复于 2003-06-05 15:59:48 得分 0

upTop

15 楼pds9902(双)回复于 2003-06-05 16:28:25 得分 0

to   楼主,  
     
      先把这个贴子结了吧,  
      我可一直在等着接分呢!!!Top

16 楼pds9902(双)回复于 2003-06-06 14:30:02 得分 0

to   楼主,  
    你上面的冒泡排序我已经帮你改好了,  
    又是一个忘记进栈出栈的问题,  
    我觉得奇怪的是,  
    上面的程序是不是你自己亲自写的,  
    如果是,应该不会犯这种低级错误啊!!!  
    楼主快结贴吧,别忘了,另开100分的帖,我把改好的冒泡排序发给你!!!Top

17 楼wuhaiping(一)回复于 2003-06-10 15:50:42 得分 0

ok,  
  全给你Top

相关问题

  • ※※数组赋值问题(VC内联汇编中的)急急急,在线等待##
  • 菜了问题,汇编有没有什么可以用的库函数??那里有教程??急急急急!!!
  • 请教,X86汇编转AT&T汇编,急急
  • 急急急急急急急急急急急急急急急用户控件的问题急急急急急急急急急急急急急急急急急急
  • 窗口重画问题!急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急
  • 急!急!急!急!急!急!急!急!急!急!急!路由问题!
  • DropDownList 问题!急急急急急急急!
  • 关于validation experssion的问题?急急急急急急急急急急急急急急急急急急急
  • 学过win32汇编高手们:帮忙!!--急!急!急(散分)
  • hook api的问题 急急急急急急急急急急急急急急急急急急急急急急急急急急

关键词

  • 循环
  • 计数器
  • ds
  • ax
  • 十六进制
  • di
  • mov
  • 程序
  • 输出
  • codestart

得分解答快速导航

  • 帖主:wuhaiping
  • pds9902

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo