汇编实验 输入N 计算1+(2+2)+3+(4+4)+…+N的值

assume cs:code,ds:data

data segment
n dw ?
result dw ?
mark1 db 'please input n (from 00 to 99 ):','$'
mark2 db 'the result is ( in binary ):','$'
data ends

code segment
start:
mov ax,data
mov ds,ax

mov ah,09h ;显示提示语
lea dx,mark1
int 21h

mov ah,1 ;输入n的高位
int 21h
mov dl,al
mov ah,1 ;输入n的低位
int 21h

mov cl,al
sub dl,30h ;将ASCII码转化为十进制
mov al,10
mul dl
mov ch,0
add cx,ax
mov ax,cx
mov n,ax

cmp ax,0 ;检测n是否为0
je l1
mov dx,n
loop fact
l1:
mov ah,09h ;显示提示语
lea dx,mark2
int 21h

mov bx,n
mov cx,8 ;以二进制形式输出结果
loop next1
mov cx,8
loop next2

next1 proc ;输出高八位
shl bh,1
mov dl,30h
adc dl,0
mov ah,2
int 21h
next1 endp
next2 proc
shl bl,1
mov dl,30h
adc dl,0
mov ah,2
int 21h
next2 endp
mov dl,'B' ;显示二进制标志
mov ah,2
int 21h
mov ah,4ch
int 21h

fact proc
mov ax,dx
mov bl,02h
div bl
cmp ah,0
jne l2
add al,al
l2:mul bl
add ax,result
mov result,ax
dec dx
fact endp

code ends
end start

这是我写的代码。不知道错误在哪里。
要求输入N是两位数,即00~99。
当n为奇数时,累加一次;当n为偶数时,累加两次。
从键盘输入n并输出结果。
编译通过了,但是输入第二个数时就自动关闭。

想请问代码错误出在哪里以及怎样修改这个代码。
感激不尽~

看了你的程序,感觉有点奇怪。

1. 程序要求用户输入两个字符(两位数字),高位数字的字符保存在DL中,低位数字的字符保存在CL中。然后你要计算出这两个数字拼在一起的两位数字的值为多少,然后把这个值放到变量n中。但是这个过程中你只注意到SUB DL,30H没有注意到也要SUB CL,30H。所以,就算输入第二个字符不自动关闭,你所计算出来的n值也是错的。

2. 第一处奇怪的地方是主程序中的LOOP FACT不知道什么意思。因为你的FACT在这里是以子程序的形式编写的。那么调用子程序应该是CALL FACT啊。就算LOOP指令能调到FACT子程序的入口,那么子程序返回时应该调到哪里呢。况且你的FACT子程序里面连RET都没有。不懂你想干嘛。

3. 第二处奇怪的地方,是我仔细分解了你的代码来查看,发现你的程序里面有很多子程序(都没有RET),可有一段代码夹在这些子程序之间了
mov dl,'B' ;显示二进制标志
mov ah,2
int 21h
mov ah,4ch
int 21h
我真搞不懂这一段代码在程序运行中是如何才能执行的,还是说删掉也不影响整体功能。

鉴于以上原因,我不明白你编写代码的意图。因此,无法能按照你的要求,在这个程序的基础上修改,来实现题目要求的问题。
如果你真的急求解答,请你及时通过百度HI留言给我。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-17
好复杂!!!!