J'ai écrit un code pour résoudre cette invite:Assemblée HLA récursif Programme
Créer un programme de langue HLA Assemblée qui demande un numéro de l'utilisateur. Créez et appelez une fonction qui calcule une valeur dans la séquence Fibonacci. En mathématiques, la séquence de Fibonacci est nommée d'après le mathématicien italien Leonardo de Pise qui était connu de son vivant comme Fibonacci. La séquence de Fibonacci commence par 1 et 1. Chaque terme plus tard dans la séquence est la somme des deux valeurs précédentes. Donc, la série sera: 1,1,2,3,5,8,13 et ainsi de suite. Afin de recevoir un crédit complet, vous devez utiliser récursion pour résoudre ce problème en créant une fonction dont la signature est:
procédure fibRec (valeur: int8); @nodisplay; @pas de cadre; Voici quelques dialogues de programme par exemple pour guider vos efforts:
fournir un numéro: 3 fib (3) = 2
Fournir une lettre: 5 fib (5) = 5
Dans un Pour vous aider à vous concentrer sur l'élaboration d'un programme d'assemblage, j'aimerais vous proposer les énoncés C suivants qui correspondent aux spécifications du programme énoncées ci-dessus. Si vous le souhaitez, utilisez-les comme base pour construire votre programme d'assemblage.
SAMPLE C CODE:
------------------------
int main()
{
int value;
printf("Provide a value: ");
scanf("%d", &value);
int f = fibRec(value);
printf("fib(%d) = %d\n", value, f);
return(0);
}
int fibRec(int value)
{
int result = 1;
if (value == 1 || value == 2) // base case
result = 1;
else
result = fibRec(value-1) + fibRec(value-2);
return(result);
}
et mon approche est d'essayer d'utiliser l'implémentation C et de le convertir en HLA. Lorsque j'exécute le programme, j'obtiens une boucle infinie (le cmd se bloque) probablement à cause de la façon dont j'ai utilisé la récursivité. Je ne suis pas sûr comment mettre en œuvre le
d'autre résultat = fibRec (valeur-1) + fibRec (valeur-2);
partie de l'implémentation C.
Voici ce que j'ai:
program fib;
#include("stdlib.hhf");
static
value : int8;
//returnAddress : dword;
//temp: int16;
procedure fibRec(value : int8); @nodisplay; @noframe;
begin fibRec;
mov(CL, value);
mov(1, DL);
cmp(CL, 1);
je Res1;
cmp(CL, 2);
je Res1;
jmp Else1;
//else result = fibRec(value-1) + fibRec(value-2);
Else1:
//mov(1, DL);
dec(CL);
call fibRec;
sub(2, CL);
call fibRec;
add(CL, DL);
jmp ProgExit;
Res1:
mov(1, DL);
jmp ProgExit;
ProgExit:
end fibRec;
/////////////////////////////////////////////////////////////////////////////////////////////////////
begin fib;
stdout.put("Provide a value: ");
stdin.get(value); //CHANGED TO IVALUE
mov(CL, value); //SAVES THE INPUT TO A REGISTER
call fibRec; // MUST CALL THE PROCEDURE
stdout.put("fib(");
stdout.puti8(value);
stdout.put(") = ");
stdout.put(DL);
end fib;
ressemble à une affectation sch. – Mox
Voir http://stackoverflow.com/a/38795365/224132 pour un Fib récursif (n) pour x86. (Cela fait partie d'une réponse à propos d'un jouet asm, mais j'ai utilisé quelques macros et le sous-ensemble commun de ce langage avec x86 pour écrire un Fib récursif (n) qui fonctionnera pour les deux.) Quoi qu'il en soit, downvoted d'autres personnes, mal documentées, et plein de beaucoup de texte non pertinent. La première moitié du message pourrait être "J'ai une mission pour implémenter Fibonacci (n) dans HLA". –