回 帖 发 新 帖 刷新版面

主题:[求教]帮忙看看一道汇编编程题哪里错了(急!拜托了!)

[size=3]编写程序完成功能:从键盘上接收两个4位十六进制数相加或相减的算式,在下一行以八进制形式输出计算结果,如:输入“3A20-2010”,输出“015020”。
程序要求根据输入算式中的加减号决定加减运算。[/size][em65]
       data  segment
       data1  dw        ?           ;回车换行
       data2  dw        ?
         opp  db        ?
        data  ends
     prognam  segment
              assume    cs:prognam,ds:data
        main  proc      far
      start:  push      ds         
              sub       ax,ax
              push      ax

              mov       ax,data     
              mov       ds,ax

      first:  mov       bx, 0
              mov       dx, 04h
              mov       cl, 4
        lp1:  mov       ah, 01h
              int       21h
              cmp       al, 'a'
              jl        num1
              sub       al, 31h
       num1:  sub       al, 30h
              shl       bx, cl
              mov       ah, 0
              add       bx, ax
              dec       dx
              jne       lp1
              mov       data1, bx
  enter_opp:
              mov       ah, 1h
              int       21h
              mov       opp, al

     second:  mov       bx, 0
              mov       dx, 04h
              mov       cl, 4
        lp2:  mov       ah, 01
              int       21h
              cmp       al, 'a'
              jl        num2
              sub       al, 31h
       num2:  sub       al, 30h
              shl       bx, cl
              mov       ah, 0
              add       bx, ax
              dec       dx
              jne       lp2
              mov       data2, bx

       line:
              mov       ah, 2
              mov       dl, 0ah
              int       21h
              mov       dl, 0dh
              int       21h

     result:
              mov       al, opp
              cmp       al, '+'
              je        datas_add
              cmp       al, '-'
              je        datas_sub
  datas_add:
              mov       ax, data1
              mov       dx, data2
              add       dx, ax
              jmp       print
  datas_sub:
              mov       ax, data1
              mov       dx, data2
              sub       ax, dx
              mov       dx, ax
      print:
              mov       data1, dx
              mov       cl, 1
              mov       bx, 01h
              mov       ch, 6
         ko:  mov       dx, data1
              rol       dx, cl
              mov       data1, dx
              and       dx, bx
              add       dl, 30h
              mov       ah, 2
              int       21h
              mov       cl, 3
              mov       bx, 07h
              dec       ch
              jne       ko

              ret                   ;返回DOS

        main  endp
     prognam  ends
              end       start

我的程序经调试已没有错误,但运行结果却不对,请大家帮忙改改哦!谢谢!

回复列表 (共1个回复)

沙发

我知道错在那里了,
   因为你定义的data1是dw的,而在左移时,用的是dx,是db类型的,
 mov       dx, data1  只能是低8为,而低8为6次左移三位之后的结果就如你得到的结果那样是:010020

我来回复

您尚未登录,请登录后再回复。点此登录或注册