主题:[讨论]这个程序错在哪
dave222_
[专家分:0] 发布于 2007-06-20 20:31:00
这上我用查表法编的求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个回复)
沙发
liangbch [专家分:1270] 发布于 2007-06-20 22:06:00
这个问题的主要难题在于十进制数的显示,计算结果显示为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
板凳
塞北江南 [专家分:1350] 发布于 2007-06-21 09:24:00
;用查表法编的求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 楼
liangbch [专家分:1270] 发布于 2007-06-21 12:22:00
发现楼上的程序有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 楼
塞北江南 [专家分:1350] 发布于 2007-06-21 13:32:00
OFFSET去掉就没问题了
我来回复