回 帖 发 新 帖 刷新版面

主题:此程序运行后为何没结果

题目:从键盘取得一个十进制数,并把该数以十六进制数形式在显示器上显示出来
程序如下:
codeseg  segment
        assume  cs:codeseg
main    proc  far
start:  call  reader
        call  relf
        call  display
        call  relf
        mov   ah,4ch
        int   21h
main    endp

reader  proc  near
        mov   bx,0
repeat: mov   ah,01h
        int   21h
        sub   al,30h
        jl    over
        cmp   al,9
        jg    over
        cbw
        xchg  ax,bx
        mov   cx,10
        mul   cx
        xchg  ax,bx
        add   bx,ax
        jmp   repeat
over:   ret
reader  endp

display   proc  near
          mov   ch,4
loop1:    mov   cl,4
          rol   bx,cl
          mov   al,bl
          and   al,30h
          cmp   al,3ah
          jl    console
          add   al,7h
console:  mov   dl,al
          mov   ah,2
          int   21h
          dec   ch
          jnz   loop1
          ret
display   endp

relf   proc  near
       mov  dl,0dh
       mov  ah,2
       int  21h
       mov  dl,0ah
       mov  ah,2
       int  21h
       ret
relf   endp
codeseg  ends
       end  start

回复列表 (共2个回复)

沙发

我看过你的代码感觉
relf   proc  near
       mov  dl,0dh
       mov  ah,2
       int  21h
       mov  dl,0ah
       mov  ah,2
       int  21h
       ret
relf   endp
codeseg  ends
       end  start
这段代码没有调用```所以没有显示结果
不知道对不对我也是刚刚学的

板凳

这应该是10进制转16进制的编程。
程序其实有输出显示(怪字符),但是思路和算法不对。
repeat: mov   ah,01h
        int   21h
        sub   al,30h
        jl    over
        cmp   al,9
        jg    over
这样取0~9有些牵强,最好使用7号功能接收键盘输入,然后如此判定输入是否合法,不合法舍弃,合法则调用2号功能显示(显示前转回ASCII码),遇到规定字符则退出输入。
你的程序中输入0~9以外的字符均导致直接返回主程序的结果。
        cbw
        xchg  ax,bx
        mov   cx,10
        mul   cx
        xchg  ax,bx
        add   bx,ax
这段有问题,这段程序应该改为在数据段(程序中没有数据段)保存键盘取得的10进制数。
输入全部完成,再对保存在数据段中的N位十进制数进行十六进制转换,并转回ASCII码,最后使用2号或9号(注意9号功能要构造一个结尾为"$的字符串")功能显示。
程序应设置输入的十进制数的最大位数。

参考:
data segment
dbuf db 100 dup(0),0
hbuf db 100 dup(0),0
data ends
code segment
  assume cs:code,ds:data,es:data
start:
  mov ax,data
  mov ds,ax
  mov es,ax  ;注意养成装填数据段、附加数据段寄存器的习惯,无论程序中用到用不到
  ;
  lea di,dbuf
  mov cx,100                  ;最大输入100位的十进制数
repget:
  mov ah,7
  int 21h
  cmp al,1Bh                   ;是ESC按键吗?
  je noget                      ;是则终止输入十进制数
  sub al,30h
  jl repget                 ;小于30h的不是合法10进制数,舍弃
  cmp al,9
  jg repget                 ;大于39h也不是合法10进制数,同样舍弃
  stosb                     ;保存到dbuf中
  mov dl,30h                ;是合法的十进制数则转回ASCII以显示
  add dl,al
  mov ah,2
  int 21h                   ;显示输入的当前位10进制数
  loop repget               ;继续取下一位十进制数
noget:
  mov ax,100
  sub ax,cx        ;现在ax中是输入的十进制数位数,可能在10进制转16进制时会用上
  push ax          ;保存在堆栈中,转16进制时记住弹出
  ;
  mov ah,2
  mov dl,0dh
  int 21h
  mov dl,0ah
  int 21h
  ;
  ;下面把保存在dbuf中的N位10进制数转成M位16进制数保存到hbuf中
  pop cx
  ;...
  ;代码就不写了,其实就是多位数除法,可参阅有关书籍
  ;同样,要保存转换后的16进制数的位数到CX中做计数器
  ;
  lea si,hbuf
nextchar:
  lodsb
  mov dl,30h
  add dl,al      ;0~9转成ASCII
  cmp dl,39h
  jle _0_9
  add dl,7h      ;A~F转成ASCII
_0_9:             ;现在dl中是十六进制数的ASCII码
  mov ah,2      ;功能号2
  int 21h       ;显示
  loop nextchar
over:
  mov ah,4ch
  int 21h
code ends
  end start

我来回复

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