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

关于键盘输入二个十制数相加的思路?请教

楼主showtime84(幻想VS失落)2005-06-15 07:36:26 在 其他开发语言 / 汇编语言 提问

我有一道题目,从键盘输入二个-32768---32767的数,中间可以用减号或加号,求最后的结果,输不输出无所谓!  
   
  我的思路是,先把输进的数转化成二进制数,然后用add,sub求最后的结果(我不太喜欢用bcd运算)  
   
  可是我这段程序总是通不过,我不知道我的这个想法对不对?  
   
  我是这么转换的(0*10)+x1*10......    
   
  谢谢!! 问题点数:40、回复次数:18Top

1 楼zara(Kyrie eleison)回复于 2005-06-15 09:27:24 得分 40

应该是   ((((0*10)+x1)*10+x2)*10+x3)*10....+xn   吧.   0   是累加和的初始值,   x1,x2,x3,   ...   是数值的各位字符,   从左向右的顺序Top

2 楼mydo(侯佩|hopy|ks)回复于 2005-06-15 10:12:19 得分 0

ascii   ->   bin  
   
  ;由   read过程   完成接受输入和转换,并将转换后的值放入   ax   返回。  
  ;以下程序在   masm611   下调试通过。  
   
  .model small  
  .data  
  val dw ?  
   
  .code  
  .startup  
  call read  
  mov val,ax  
   
  .exit  
   
  read proc near  
  push bx  
  push cx  
  mov cx,10  
  mov bx,0  
  read1:  
  mov ah,1  
  int 21h  
   
  cmp al,'0'  
  jb read2  
  cmp al,'9'  
  ja read2  
   
  sub al,'0'  
   
  push ax  
  mov ax,bx  
  mul cx  
  mov bx,ax  
  pop ax  
  mov ah,0  
  add bx,ax  
  jmp read1  
  read2:  
  mov ax,bx  
  pop cx  
  pop bx  
  ret  
  read endp  
  endTop

3 楼showtime84(幻想VS失落)回复于 2005-06-15 17:42:00 得分 0

楼上的二位老大,我的重点是,我的先转换成二进制再相加或相减和思路可行吗?   并不是我不会转换成二进制..........  
   
  谢谢!Top

4 楼zara(Kyrie eleison)回复于 2005-06-15 19:24:55 得分 0

当然可用的,   这样的方法,   对于计算而言,   是最简单的Top

5 楼showtime84(幻想VS失落)回复于 2005-06-15 19:36:52 得分 0

to:mydo    
   
      我想问一下*10是用你的方法执行速度快还是   用移位指令和加法指令执行快呢?    
   
  Top

6 楼showtime84(幻想VS失落)回复于 2005-06-15 19:37:45 得分 0

to:zara  
   
    我关键是找不到我程序在那里错了,结果总是不对!  
   
  我再去看看,实在不行就只有把源程序发上来,请教大家了!Top

7 楼zara(Kyrie eleison)回复于 2005-06-15 19:44:15 得分 0

这个问题,   在转换那里置断点,   看看转换后的结果是否正确就知道了.   结果对的话,   就是后面的计算有问题,   结果不对,   当然就是转换部分有   bug   了Top

8 楼showtime84(幻想VS失落)回复于 2005-06-15 19:59:38 得分 0

我初学,不会置断点............Top

9 楼showtime84(幻想VS失落)回复于 2005-06-15 20:01:46 得分 0

data                   segment  
  result               dw   ?  
  putbuf1             db   5,0,5   dup   (?)                             ;定义二个输入缓冲区  
  putbuf2             db   5,0,5   dup   (?)  
  data                   ends  
  stack                 segment   para   stack   'stack'  
  tpan                   db   100   dup   (?)  
  stack                 ends  
  code                   segment  
                            assume   cs:code,ds:data,ss:stack  
  main                   proc   far  
                            push   ds  
                            xor   ax,ax  
                            push   ax  
                            mov   ax,data  
                            mov   ds,ax  
                            mov   ax,stack  
                            mov   ss,ax  
   
               
                            mov   dx,offset   putbuf1               ;输入第一个十进制数  
                            mov   ah,0ah  
                            int   21h  
                            mov   si,offset   putbuf1  
                            inc   si  
                            mov   cx,[si]  
                            inc   si  
                            call   zhuanhuan                         ;转换后结果在ax中  
                            mov   bx,ax  
   
   
                            mov   dx,offset   putbuf2                   ;输入第二个十进制数  
                            mov   ah,0ah  
                            int   21h  
                            mov   si,offset   putbuf2  
                            inc   si  
                            mov   cx,[si]  
                            inc   si  
                            call   zhuanhuan  
   
                           
                            add   bx,ax  
   
  exit:                 mov   result,bx式                       ;存结果  
                            ret  
  main                   endp  
   
  zhuanhuan         proc  
                            push   bx  
                            push   cx  
                            push   si  
                            xor   ax,ax  
                            xor   bx,bx  
   
  again:               add   ax,ax                     ;   ax*10  
                            mov   dx,ax  
                            add   ax,ax  
                            add   ax,ax  
                            add   ax,dx  
                            mov   bl,[si]  
                            and   bl,0fh  
                            add   ax,bx  
                            inc   si  
                            loop   again  
   
                            pop   si  
                            pop   cx  
                            pop   bx  
                            ret  
  zhuanhuan         endp  
  code                   ends  
                            end   mainTop

10 楼showtime84(幻想VS失落)回复于 2005-06-15 20:02:46 得分 0

我已将程序精减到只剩最后的主框架了,希望不要花费你们太长的时间,帮我看一下错误在那里!  
   
  我求不到最后的正确结果!Top

11 楼top_mao()回复于 2005-06-15 20:04:06 得分 0

to楼主:  
              程序基本上每个人看看书都可以写出来,关键是你要你要有思路,遇到bug,要懂得哪里可以出错,懂得用tools,解bug。就如,你那条程序,你没有想过用debug,跟踪程序吗???你的程序挺少的,步步跟踪也不会难的。  
            慢慢试吧。如果不会用debug,那你可以花28元买本王爽的《汇编语言》来看看吧,那里说的很长细。Top

12 楼showtime84(幻想VS失落)回复于 2005-06-15 20:06:59 得分 0

我的书上debug就一带而过,所以我根本就不会什么跟踪调试什么的!  
   
  Top

13 楼zara(Kyrie eleison)回复于 2005-06-15 21:19:00 得分 0

...  
                            mov   dx,offset   putbuf1               ;输入第一个十进制数  
                            mov   ah,0ah  
                            int   21h  
                            mov   si,offset   putbuf1  
                            inc   si  
                            mov   cx,[si]           ;**   问题在这里吧.   cx   是   word,   而那个长度域是   byte  
                            inc   si  
                            call   zhuanhuan                         ;转换后结果在ax中  
                            mov   bx,ax  
  ...  
   
  ;   上面的这个问题的解决,   一是可用先置   cx   为   0,   再     mov   cl,   byte   ptr   [si]  
  ;       也可以在程序开始时加上:  
    .model   small  
    .386  
  然后,   将那条指令替换为   movzx     cx,   byte   ptr   [si]  
   
   
  第二个操作数也是一样的问题Top

14 楼showtime84(幻想VS失落)回复于 2005-06-15 21:36:21 得分 0

我真要晕掉了,原来错误在那里,可是为什么汇编时不报类型不匹配的错误呢?  
   
  如果mov   [si],al     这样汇编时就会报错,   我对这部分有点不是太明了,希望能指导一下,谢谢!Top

15 楼showtime84(幻想VS失落)回复于 2005-06-15 21:55:21 得分 0

真是太感谢了,我的那个类似于计算器的程序,原来错误就在这么一个小小的地方!  
   
  再次感谢zara,另外开个贴子散分给你,谢谢!Top

16 楼zara(Kyrie eleison)回复于 2005-06-15 21:58:39 得分 0

[si]   处的类型,   不是编译程序能够确定的,   这个是我们在使用   int21h   的   0ah   功能时规定的.   所以,   汇编时不一定能报错误.   究竟是否报错,   和   si   前面是否有使用约定有关,   如果,   前面有   assume   si:PTR   BYTE   说明   si   是指向   byte   类型的,   那么   mov   cx,   [si]   就会报错了.   另外,   可能和编译器的版本也有关系吧Top

17 楼zara(Kyrie eleison)回复于 2005-06-15 21:59:48 得分 0

谢谢!   不过,   不要另外开帖子了吧,   我现在还不怎么缺分的Top

18 楼showtime84(幻想VS失落)回复于 2005-06-15 22:10:09 得分 0

解决问题,完成了程序,高兴中,散分给大家!!Top

相关问题

  • 模拟键盘输入2
  • 键盘输入问题
  • 模拟键盘输入!!!!!!
  • 键盘输入不回显
  • 如何接收键盘所有输入...
  • 模拟键盘输入如何做
  • 关于模拟键盘输入
  • 关于模拟键盘输入2
  • 在网页中模拟键盘输入
  • 怎样接收键盘输入阿?

关键词

  • 转换
  • 二进制
  • 指令
  • debug
  • db
  • si
  • 程序
  • putbuf
  • 报错
  • 思路

得分解答快速导航

  • 帖主:showtime84
  • zara

相关链接

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

广告也精彩

反馈

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