2017-08-13 7 views
1

J'ai écrit ce code mais mon professeur me disait de conserver et de restaurer mes registres. Je pensais que j'étais en déclarant une valeur aux registres vides.assemblage comment conserver et restaurer un registre

program middleFinder; 
#include("stdlib.hhf"); // imports the input and output library 
static 
iDataX : int16 := 0; 
iDataY : int16 := 0; 
iDataZ : int16 := 0; 


procedure middleFindernow(x: int16; y : int16; z : int16); @nodisplay; @noframe; 
// this caller must free up DH 
static 
iReturnAddress : dword; 
iMid : int16; 
iTemporary : int16; 
iRegisterValue : dword; 


begin middleFindernow; 


mov(EBX, iRegisterValue); 
// acquire parameters on the stack 
pop(iReturnAddress); 
pop(iTemporary); 
pop(iTemporary); 
mov(iTemporary, BX); 
mov(BX, z); 
pop(iTemporary); // this is Y 
mov(iTemporary, BX); 
mov(BX, y); 
pop(iTemporary); // this is X 
mov(iTemporary, BX); 
mov(BX, x); 
// push back the return 
push(iReturnAddress); 
push(iRegisterValue); 

// calculate x - y 
mov(x, DX); 
cmp(y, DX); 
je XYequal; 
cmp(y, DX); 
jl YisMax; 
cmp(y, DX); 
jg XisMax; 

XYequal: 
mov(y, BX); 
cmp(z, BX); 
je equal; 
jmp ExitSequence; 

equal: 
stdout.put("All three values are equal"); 
stdout.put("AL=1"); 
jmp ExitSequence; 

XisMax: 
// calculate x - z 
mov(0,BX); 
mov(z,BX); 
cmp(x,BX); 
jl PutXinDX; 
jg PutZinDX; 


YisMax: 
// calculate y - z 
mov(0, BX); 
mov(y, BX); 
cmp(z, BX); 
jl PutYinDX; 
jg PutZinDX; 


PutXinDX: 
mov(x, DX); 
jmp ExitSequence; 

PutYinDX: 
mov(y, DX); 
jmp ExitSequence; 

PutZinDX: 
mov(z, DX); 
jmp ExitSequence; 

ExitSequence: 
// exit sequence 
// pop all preserved registers --- BX 
pop(EBX); 
ret(); 


end middleFindernow; 
begin middleFinder; 
stdout.put("gimme a X value: "); 
stdin.get(iDataX); 
stdout.put("gimme a Y value: "); 
stdin.get(iDataY); 
stdout.put("gimme a Z value: "); 
stdin.get(iDataZ); 
stdout.put("Calling Mid number " , nl); 
mov(0, BX); 
mov(iDataX, BX); 
push(BX); 
mov(0, BX); 
mov(iDataY, BX); 
push(BX); 
mov(0, BX); 
mov(iDataZ, BX); 
push(BX); 
mov(0, BX); 
push(BX); 
call middleFindernow; 
stdout.put("The value in the middle is "); 
stdout.puti16(DX); 
stdout.newln(); 

end middleFinder; 
+1

Il vous dit de sauvegarder les valeurs des registres pendant le prologue de la fonction et de les restaurer dans l'épilogue. –

Répondre

0

Vous avez utilisé certains registres comme BX mais à la fin vous ne rétablissent pas leurs valeurs initiales à partir avant que votre programme a commencé, il peut être ce que votre professeur voulait dire

0

Je suppose que vous voulez professeur, que dans le Au début de vos fonctions, vous allez pousser tous les registres, cette fonction est en train de passer à la pile et avant le retour, vous allez restaurer les valeurs réelles de ces registres. Cela est nécessaire car le code qui appellera vos fonctions pourrait utiliser ces valeurs ultérieurement et ne s'attend pas à ce que les valeurs aient été modifiées.