Pop/Push 说明
Pop/Push Instruction
我需要帮助解决这种推送弹出情况。我正在尝试编写一个 HLA 汇编语言程序,该程序实现一个函数,该函数正确识别何时所有四个参数都相同,并且 returns AL 中的布尔值(当所有四个值都相等时为 1;否则为 0)。
到目前为止,这是我的代码:
program same;
#include("stdlib.hhf");
static
w : int16 :=0;
x : int16 :=0;
y : int16 :=0;
z : int16 :=0;
temp : int16;
// Function theSame //
procedure theSame(w:int16; x:int16; y:int16; z:int16); @nodisplay; @noframe;
static
returnAddress : dword;
similar: int16;
begin theSame;
pop(returnAddress);
pop(similar); // Padding - stacking must be 32 bit align
pop(z);
pop(y);
pop(x);
pop(w);
push(returnAddress);
stdout.put( "w = ", w, nl );
stdout.put( "x = ", x, nl );
stdout.put( "y = ", y, nl );
stdout.put( "z = ", z, nl );
stdout.put( "cmp w x ", nl );
mov(w,AX);
cmp(AX,x);
je Equal;
jne Notequal; // (w==x)
stdout.put( "cmp x y ", nl );
mov(x,AX);
cmp(AX,y);
je Equal;
jne Notequal; // (x==y)
stdout.put( "cmp y z ", nl );
mov(y,AX);
cmp(AX,z);
je Equal;
jne Notequal; // (y==z)
stdout.put( "cmp z w ", nl );
mov(z,AX);
cmp(AX,w);
je Equal;
jne Notequal; // (w==z)
Equal:
stdout.put( "equal", nl );
mov(1,AX);
push(similar); // padding
jmp ExitSequence;
Notequal:
stdout.put( "not equal", nl );
mov(0,AX);
push(similar); // padding
jmp ExitSequence;
ExitSequence:
ret();
end theSame;
begin same;
stdout.put("Feed Me W: ");
stdin.get(w);
push(w);
stdout.put("Feed Me X: ");
stdin.get(x);
push(x);
stdout.put("Feed Me Y: ");
stdin.get(y);
push(y);
stdout.put("Feed Me Z: ");
stdin.get(z);
push(z);
call theSame;
cmp(AX, 1);
je YESEQUAL;
jmp NOEQUAL;
YESEQUAL:
stdout.put("True", nl);
jmp EndProgram;
NOEQUAL:
stdout.put("False", nl);
jmp EndProgram;
stdout.newln();
EndProgram:
end same;
然而,输出结果是这样的:
输入:
喂我 W:8
喂我 X:7
喂我 Y:6
喂我 Z:5
输出:
宽度:-165
X:8
是:7
Z:6
厘米宽 x
不等于
为什么它们彼此具有相同的价值,这是有原因的吗?混淆 push 和 pop 的工作原理。谢谢。
pop(similar); // Padding - stacking must be 32 bit align
显然您需要删除此 pop(similar)
指令。如果你离开它,它会获得 z 参数的值。并使 w 从堆栈中获取垃圾!不要忘记也删除 push(similar)
说明。
入口处的堆栈布局:
x x 5 6 7 8 -165
----
^ ^ ^ ^ ^
| z y x w all 4 words
dword return address
pop(returnAddress);
pop(z);
pop(y);
pop(x);
pop(w);
push(returnAddress);
我需要帮助解决这种推送弹出情况。我正在尝试编写一个 HLA 汇编语言程序,该程序实现一个函数,该函数正确识别何时所有四个参数都相同,并且 returns AL 中的布尔值(当所有四个值都相等时为 1;否则为 0)。
到目前为止,这是我的代码:
program same;
#include("stdlib.hhf");
static
w : int16 :=0;
x : int16 :=0;
y : int16 :=0;
z : int16 :=0;
temp : int16;
// Function theSame //
procedure theSame(w:int16; x:int16; y:int16; z:int16); @nodisplay; @noframe;
static
returnAddress : dword;
similar: int16;
begin theSame;
pop(returnAddress);
pop(similar); // Padding - stacking must be 32 bit align
pop(z);
pop(y);
pop(x);
pop(w);
push(returnAddress);
stdout.put( "w = ", w, nl );
stdout.put( "x = ", x, nl );
stdout.put( "y = ", y, nl );
stdout.put( "z = ", z, nl );
stdout.put( "cmp w x ", nl );
mov(w,AX);
cmp(AX,x);
je Equal;
jne Notequal; // (w==x)
stdout.put( "cmp x y ", nl );
mov(x,AX);
cmp(AX,y);
je Equal;
jne Notequal; // (x==y)
stdout.put( "cmp y z ", nl );
mov(y,AX);
cmp(AX,z);
je Equal;
jne Notequal; // (y==z)
stdout.put( "cmp z w ", nl );
mov(z,AX);
cmp(AX,w);
je Equal;
jne Notequal; // (w==z)
Equal:
stdout.put( "equal", nl );
mov(1,AX);
push(similar); // padding
jmp ExitSequence;
Notequal:
stdout.put( "not equal", nl );
mov(0,AX);
push(similar); // padding
jmp ExitSequence;
ExitSequence:
ret();
end theSame;
begin same;
stdout.put("Feed Me W: ");
stdin.get(w);
push(w);
stdout.put("Feed Me X: ");
stdin.get(x);
push(x);
stdout.put("Feed Me Y: ");
stdin.get(y);
push(y);
stdout.put("Feed Me Z: ");
stdin.get(z);
push(z);
call theSame;
cmp(AX, 1);
je YESEQUAL;
jmp NOEQUAL;
YESEQUAL:
stdout.put("True", nl);
jmp EndProgram;
NOEQUAL:
stdout.put("False", nl);
jmp EndProgram;
stdout.newln();
EndProgram:
end same;
然而,输出结果是这样的:
输入:
喂我 W:8 喂我 X:7 喂我 Y:6 喂我 Z:5
输出:
宽度:-165 X:8 是:7 Z:6 厘米宽 x 不等于
为什么它们彼此具有相同的价值,这是有原因的吗?混淆 push 和 pop 的工作原理。谢谢。
pop(similar); // Padding - stacking must be 32 bit align
显然您需要删除此 pop(similar)
指令。如果你离开它,它会获得 z 参数的值。并使 w 从堆栈中获取垃圾!不要忘记也删除 push(similar)
说明。
入口处的堆栈布局:
x x 5 6 7 8 -165
----
^ ^ ^ ^ ^
| z y x w all 4 words
dword return address
pop(returnAddress);
pop(z);
pop(y);
pop(x);
pop(w);
push(returnAddress);