回 帖 发 新 帖 刷新版面

主题:[讨论]这个程序错在哪

这上我用查表法编的求2的N(0-7)次方的程序,可是找不到错误,请帮忙!

       STACK  SEGMENT   STACK'stack'
              DW        40 DUP(0)
       STACK  ENDS
        DATA  SEGMENT
input db'please input n(0-7):$'
lfb db'1$ 2$ 4$ 8$ 16$ 32$ 64$ 128$'
           N  DB        0
        DATA  ENDS
        CODE  SEGMENT
       START  PROC      FAR
              ASSUME    SS:STACK,CS:CODE,DS:DATA
              PUSH      DS
              SUB       AX,AX
              PUSH      AX
              MOV       AX,DATA
              MOV       DS,AX
              MOV       DX,OFFSET INPUT
              MOV       AH,9
              INT       21H
              MOV       AH,1
              INT       21H
              MOV       N,AL
              MOV       AH,2
              MOV       DL,0AH
              INT       21H
              MOV       DL,N
              AND       DL,0FH
              MOV       CL,2
              SHL       DL,CL
              MOV       DH,0
              ADD       DX,OFFSET LFB
              MOV       AH,9
              INT       21H
              RET
       START  ENDP
        CODE  ENDS
              END       START

回复列表 (共4个回复)

沙发

这个问题的主要难题在于十进制数的显示,计算结果显示为10进制数,可能有1-3个字符,如1,2,4,8,16,32,64,128。因此手先需要将2进制转化10进制,然后显示.
下面的程序已经经过调试,可正常运行.

.model small

STACK  SEGMENT   STACK'stack'
       DW        40 DUP(0)
STACK  ENDS

DATA  SEGMENT
mess db 'please input n(0-7):',0dh,0ah,'$'
buff db  10, 0, 10 dup(?)
result db 0,0,0,0dh,0ah,'$'
DATA  ENDS


CODE  SEGMENT
START  PROC      FAR
   ASSUME    SS:STACK,CS:CODE,DS:DATA
   PUSH      DS
   SUB       AX,AX
   PUSH      AX
   MOV       AX,DATA
   MOV       DS,AX
   
   MOV       DX,OFFSET mess    ;显示提示信息
   MOV       AH,9
   INT       21H
   
 
   MOV DX,OFFSET buff    ;从控制台输入一个字符串,首个字符存于buff[2]
   MOV AH,10
   INT 21H 

   MOV BX,OFFSET buff
   MOV cl,BYTE PTR [BX+2]
   SUB cl,'0'        ;转化'0'-'7' to 0-7
   MOV AX,1
 
   shl al,cl        ;计算2的n次方
   mov dh,10
 
   MOV BX,OFFSET result
   div dh            ;
   add ah,'0'        ;求出10进制表示的个位
   add [bx+2], ah
 
   mov ah,0
   div dh            ;
   add ah,'0'        ;;求出10进制表示的10位
   add [bx+1], ah
  
   mov ah,0
   div dh            ;
   add ah,'0'        ;;;求出10进制表示的百位
   add [bx], ah
   dec bx
              
             
skipzero:
   inc bx             ;如果高位为'0',跳过
   cmp byte ptr [bx],'0'
   jz skipzero        ;

   mov   dx,bx
   MOV   AH,9    ;显示计算结果
   INT   21H
   RET
              
START  ENDP
   CODE  ENDS
      END       START

板凳

;用查表法编的求2的N(0-7)次方的程序

       STACK  SEGMENT   STACK'stack'
              DW        40 DUP(0)
       STACK  ENDS
       DATA  SEGMENT
input db'please input n(0-7):$'
lfb db '  1$  2$  4$  8$ 16$ 32$ 64$128$'
       DATA  ENDS
        CODE  SEGMENT
       START  PROC      FAR
              ASSUME    SS:STACK,CS:CODE,DS:DATA
              PUSH      DS
              SUB       AX,AX
              PUSH      AX
              MOV       AX,DATA
              MOV       DS,AX
              MOV       DX,OFFSET INPUT
              MOV       AH,9
              INT       21H
              MOV       AH,1
              INT       21H
              and   AL,0fh
              shl al,1
              shl al,1
              mov bh,0
              mov bl,al
              lea       DX, LFB[bx]
              MOV       AH,9
              INT       21H
              RET
       START  ENDP
        CODE  ENDS
              END       START

3 楼

发现楼上的程序有3处错误:
1. "lea       DX,OFFSET LFB[bx]" 在ml 6.15下不能通过编译,

应改为:
     lea       DX,OFFSET LFB
     add       dx,bx

  
2.数组lfb定义(见下)在输出时会导致显示错位,
lfb db '  1$  2$  4$  8$ 16$ 32$ 64$128$'

应该定义为:
lfb db '1$  2$  4$  8$  16$ 32$ 64$ 128$'

3.这是一个很小的错误,仅仅是输出不友好,在输入后没有换行,导致输入和输出混在一起,让人误解.

4 楼

OFFSET去掉就没问题了

我来回复

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