Assembly 如何找到汇编中描述中提到的下列函数F的第k个项

Assembly 如何找到汇编中描述中提到的下列函数F的第k个项,assembly,Assembly,这是我回答上述问题的代码。但我面临着与产出相关的问题。对于1,2,3,4,5,6,its显示正确的输出 但对于7,输出必须是72 对于8,它应该是1152 对于9,它应该是96768。 另外:答案1中也提供了解决此问题的算法。 我的作业要求将结果存储在内存中。但我想展示学习的结果 算法:比我想象的要简单。我开发了一个简单的算法: 让t1=1、t2=1、t3=1存储最后三个值,让R存储结果 DATA SEGMENT NUM1 DB 1 NUM2 DB 1 NUM3 DB 1 k DB ? RES

这是我回答上述问题的代码。但我面临着与产出相关的问题。对于1,2,3,4,5,6,its显示正确的输出 但对于7,输出必须是72 对于8,它应该是1152 对于9,它应该是96768。

另外:答案1中也提供了解决此问题的算法。
我的作业要求将结果存储在内存中。但我想展示学习的结果

算法:比我想象的要简单。我开发了一个简单的算法: 让
t1=1、t2=1、t3=1
存储最后三个值,让
R
存储结果

DATA SEGMENT
NUM1 DB 1
NUM2 DB 1
NUM3 DB 1
k DB ?
RESULT DB ?
MSG1 DB 10,13,"ENTER VALUE OF k: $"
MSG3 DB 10,13,"RESULT F(k) = $"
ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
SUB AL,30H
MOV k,AL        ; Input value of k stored in k
CMP AL,4
JL SETONE       ; if input is less than 4 than set result to 1
MOV BL,3    ; Counter BL = 4
LOOPSTART:
MOV CL,NUM2     ; 2nd Last Value stored in CX
MOV DL,NUM1     ; 3rd Last Value stored in DX
ADD CL,DL       ; CX= CX+DX
MOV AL,NUM3     ; Last Value stored in AX
MUL CL          ; AX= AX*CX
;ADD AX,30H
AAM
MOV DH,NUM2
MOV NUM1,DH
MOV DH,NUM3
MOV NUM2,DH
MOV NUM3,AL
INC BL
MOV CL,k
CMP BL,CL
JNE LOOPSTART
JMP SHOWRESULT
SETONE:         ; jump here if k is less than 4
MOV AL,1        ; set result = 1
MOV RESULT,AL

SHOWRESULT:
ADD AH,30H
ADD AL,30H
MOV BX,AX
LEA DX,MSG3
MOV AH,9
INT 21H
MOV AH,2
MOV DL,BH
INT 21H
MOV AH,2
MOV DL,BL
INT 21H
MOV AH,4CH
INT 21H
ENDS
END START
——输入n

如果(除非有一些愚蠢的要求使其递归,否则您只需要4个寄存器来跟踪序列中的最后3个值。比普通的斐波那契序列多出一个。如果您使用x86,请参阅示例。只需在其中的某个位置添加另一个
mov
imul eax、edx
或其他内容。@PeterCordes谢谢你的帮助,它完成了,没有这样的要求使它递归。你对这个问题的尝试,以及你运行它时到底发生了什么的细节。代码在注释中是不可读的。(但是从
sub al,30h
我看到没有任何
div
指令,你可能在使用只对一位数有效的东西。这显然不起作用。请参阅中常见问题解答中的多位数部分。哦,使用AAM时,它可能对两位数有效。@PeterCordes:请参阅下面的代码和al答案。)因此,附加输出图像。检查该答案并帮助我找到输出的问题。如果您需要它来处理96768的输出,它不适合16位,那么您需要使用32位寄存器或使用
mul-cx
的32位DX:AX结果(而不是
mul-cl
,这与您的注释不符)你的
R
“变量”不需要存在于内存中,只需要注册。或者实际上赋值要求将其存储在内存中;这比打印它容易。
DATA SEGMENT
NUM1 DB 1
NUM2 DB 1
NUM3 DB 1
k DB ?
RESULT DB ?
MSG1 DB 10,13,"ENTER VALUE OF k: $"
MSG3 DB 10,13,"RESULT F(k) = $"
ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
SUB AL,30H
MOV k,AL        ; Input value of k stored in k
CMP AL,4
JL SETONE       ; if input is less than 4 than set result to 1
MOV BL,3    ; Counter BL = 4
LOOPSTART:
MOV CL,NUM2     ; 2nd Last Value stored in CX
MOV DL,NUM1     ; 3rd Last Value stored in DX
ADD CL,DL       ; CX= CX+DX
MOV AL,NUM3     ; Last Value stored in AX
MUL CL          ; AX= AX*CX
;ADD AX,30H
AAM
MOV DH,NUM2
MOV NUM1,DH
MOV DH,NUM3
MOV NUM2,DH
MOV NUM3,AL
INC BL
MOV CL,k
CMP BL,CL
JNE LOOPSTART
JMP SHOWRESULT
SETONE:         ; jump here if k is less than 4
MOV AL,1        ; set result = 1
MOV RESULT,AL

SHOWRESULT:
ADD AH,30H
ADD AL,30H
MOV BX,AX
LEA DX,MSG3
MOV AH,9
INT 21H
MOV AH,2
MOV DL,BH
INT 21H
MOV AH,2
MOV DL,BL
INT 21H
MOV AH,4CH
INT 21H
ENDS
END START
    -- Input n
IF(n<=3){
    R=1
} else  {
    limit=n;
    counter=4;
    While(counter!=n){
        R=t3*(t2+t1);
        t1=t2;
        t2=t3;
        t3=R;
        counter++;
    }
}
Print R;