回 帖 发 新 帖 刷新版面

主题:怎么这个也会是死循环啊

这是我写的一个求最大最小数,并显示出最大数的程序,可不知怎么的,就是一个死循环,大家帮帮忙哈

data       SEGMENT
             xx  DW    10,5,6,78,9
             cn  DW    ($-xx)/2
             max DW     ?
             min DW     ?
data       ENDS
code          SEGMENT
MAIN          PROC  FAR
             ASSUME    CS:code,DS:data
              MOV      AX,data
              MOV      DS,AX
              MOV      CX,cn
              DEC      CX
              LEA      SI,XX
              MOV      AX,[SI]
              MOV      max,AX
              MOV      min,AX
    
    COMP:     ADD      SI,2
              MOV      AX,[SI]
              CMP      AX,max
              JL       next
              MOV      max,AX
              JMP      SHORT LOP
   next:      CMP      AX,min
              JG       LOP
              MOV      min,AX
   LOP:       LOOP     COMP
              CALL     BIN_DEC
              MOV      AX,4C00H
              INT      21H
MAIN     ENDP  
   BIN_DEC  PROC                  ;屏幕输出
              MOV   BX,10
    CHANG:    MOV   AX,max
              CMP   AX,0
              JZ    CC
                XOR   DX,DX
                DIV   BX
                MOV   max,DX
                MOV   DL,AL
                ADD   DL,30H
                MOV   AH,2
                INT   21H
                JMP   SHORT CHANG
       CC:    ret
  BIN_DEC endp                 
CODE     ENDS
         END      MAIN
         

回复列表 (共2个回复)

沙发

屏幕输出子程序有问题。

修改如下:
data       SEGMENT
             xx  DW    10,5,6,78,9
             cn  DW    ($-xx)/2
             max DW     ?
             min DW     ?
             
             disp db 'Max:'         ;添加2行
             dat db '0000','H$'
data       ENDS
code          SEGMENT
MAIN          PROC  FAR
             ASSUME    CS:code,DS:data
              MOV      AX,data
              MOV      DS,AX
              MOV      CX,cn
              DEC      CX
              LEA      SI,XX
              MOV      AX,[SI]
              MOV      max,AX
              MOV      min,AX
    
    COMP:     ADD      SI,2
              MOV      AX,[SI]
              CMP      AX,max
              JL       next
              MOV      max,AX
              JMP      SHORT LOP
   next:      CMP      AX,min
              JG       LOP
              MOV      min,AX
   LOP:       LOOP     COMP

              mov ax,max    ;调用子程序,6行
              lea bx,dat
              CALL     done
              lea dx,disp
              mov ah,09h
              int 21h
     
              MOV      AX,4C00H
              INT      21H
MAIN     ENDP  

done proc near   ;子程序
    mov ch,4
    mov cl,4
  done1:
    rol ax,cl
    mov dx,ax
    and dx,0fh
    add dl,30h
    cmp dl,39h
    jle store
    add dl,07h
  store:
    mov [bx],dl
    inc bx
    dec ch
    jnz done1
    ret
done endp
      
CODE     ENDS
         END      MAIN

板凳


我看过了,我这个程序的错误在于二进制数转为十进制数时把商的值是放在AX中记成放在DX中了


BIN_DEC  PROC                  ;屏幕输出
              MOV   BX,10
    CHANG:    MOV   AX,max
              CMP   AX,0
              JZ    CC
                XOR   DX,DX
                DIV   BX
                MOV   max,DX    ;就是这里了,应该是AX,不是DX          
                MOV   DL,AL     ;这句是多余的
                ADD   DL,30H
                MOV   AH,2
                INT   21H
                JMP   SHORT CHANG
       CC:    ret

改过后,程序可以工作了。只是,这个程序的输出也是先输出低位后输出高位
要想正确输出还得改改DL的位置

我来回复

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