我正在为计算机工程课程的介绍工作。我正在尝试编写一个从用户输入数字的子程序,然后在H寄存器中返回这个数字。
从我所看到的情况来看,单个数字输入可以正常工作,但是当我尝试继续并添加另一个时,它会在H寄存器中返回(输入#)+ 1。
输入不会超过两个字符,且不会超过20个。
readN: ; This subroutine reads a number digit from the user
; and returns this number in H
; Inputs: none
; Outputs: H register
push b
push psw
push h ; store registers in stack
mvi b,0 ; Zero out the B register
lxi d,mess4 ; "Enter number: $"
call bdos ; bdos = 0005
nextN: mvi c,1 ; C = 1 --> Read character
call bdos
cpi cr ; cr = 0Dh (carriage return)
jz lastN ; if input was carriage return --> go to lastN
mvi h,10 ; set up H register for multiplication
sui '0' ; subtract ASCII 0 from input, leaving the numerical value
mov e,a ; store accumulator in E register
mov a,b ; bring B register (existing number) to accumulator
mult: add b
dcr h ; decrements multiplication tracker
jnz mult ; if h != 0 --> redo addition
add e ; add E register (new input) to old input*10
mov b,a ; store result in b
jmp nextN ; redo input
lastN: pop h
mov h,b
pop psw
pop b
ret
谁能看到我在这里做错了什么?我希望我提供了所有内容,但如果我需要清除代码,请告诉我。
谢谢!
答案 0 :(得分:1)
这样做是因为:
mov a,b ; bring B register (existing number) to accumulator
mult: add b
dcr h ; decrements multiplication tracker
jnz mult ; if h != 0 --> redo addition
您使用b
加载累加器,因此它已经b*1
,然后您的循环运行10次并向其添加b*10
,因此您将获得{{1} }}。要么循环运行9次,要么从归零累加器开始。
PS:学会使用调试器。