2017-08-13 40 views
1

Ich schrieb diesen Code, aber mein Professor sagte mir ständig, meine Register zu konservieren und wiederherzustellen. Ich dachte, ich würde einen Wert für die leeren Register deklarieren.Versammlung, wie man ein Register konserviert und wiederherstellt

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

Er sagt Ihnen, dass Sie die Werte der Register während des Funktionsprologs speichern und im Epilog wiederherstellen sollen. –

Antwort

0

Sie verwenden einige Register wie BX aber am Ende Sie nicht wiederherstellen ihre Anfangswerte aus der Zeit vor Ihrem Programm gestartet wird, kann es sein, was Ihr Professor gemeint

0

ich Professor annehmen will, dass in der Zu Beginn Ihrer Funktionen werden Sie alle Register drücken, diese Funktion wechselt auf den Stack und vor der Rückkehr werden Sie die tatsächlichen Werte dieser Register wiederherstellen. Dies ist erforderlich, da Code, der Ihre Funktionen aufruft, diese Werte später verwenden kann und nicht erwartet, dass Werte geändert werden.

Verwandte Themen