2017-08-13 52 views
1

私はこのコードを書いたが、私の教授は私のレジスタを保存して復元するようにと言った。私は空のレジスタに値を宣言していると思った。assemblyレジスタを保存して復元する方法

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

彼は関数のプロローグ中にレジスタの値を保存し、エピローグでそれを復元するように指示しています。 –

答えて

0

私がいることを、教授はたいとあなたはBXのようないくつかのレジスタを使用しますが最後に、あなたはあなたのプログラムが始まる前からの初期値を回復していない、それはあなたの教授が

0

を意味したものかもしれ関数の始めからすべてのレジスタがプッシュされ、その関数はスタックに変更されます。戻り前にこれらのレジスタの実際の値を復元します。これは、関数を呼び出すコードでこれらの値を後で使用でき、値が変更されたことを期待しないために必要です。

関連する問題