程序集如何保存和恢复寄存器
问题描述:
我写了这段代码,但我的教授一直告诉我要保存和恢复我的寄存器。我以为我是通过向空的寄存器声明一个值。程序集如何保存和恢复寄存器
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;
答
您使用的一些寄存器像BX,但最后你不从程序开始前恢复它们的初始值,它可能是你的教授的意思
答
我想教授希望,即在你的函数开始时你会推送所有寄存器,该函数正在变成堆栈,在返回之前你将恢复这些寄存器的实际值。这是必需的,因为调用你的函数的代码可能会稍后使用这些值,并且不会期望值发生了改变。
他告诉你在函数序言中保存寄存器的值,并在后记中恢复它们。 –