Stored procedures HLA:为什么EAX寄存器在退出递归过程时保持零值?
我尝试使用递归过程来计算高级汇编中的a-B。计算完差值后,将其存储在EAX寄存器中,以便在程序结束时显示 我的问题:退出过程之前,寄存器EAX和EBX中的值是正确的,但我不明白为什么当A大于B时EAX总是为零 ret()命令是否导致了这种情况?我的代码有什么问题?有人请帮帮我 以下是示例代码:Stored procedures HLA:为什么EAX寄存器在退出递归过程时保持零值?,stored-procedures,recursion,hla,Stored Procedures,Recursion,Hla,我尝试使用递归过程来计算高级汇编中的a-B。计算完差值后,将其存储在EAX寄存器中,以便在程序结束时显示 我的问题:退出过程之前,寄存器EAX和EBX中的值是正确的,但我不明白为什么当A大于B时EAX总是为零 ret()命令是否导致了这种情况?我的代码有什么问题?有人请帮帮我 以下是示例代码: program MainSubtractionFunction; #include( "stdlib.hhf" ); static iDataValue1 : int32 := 0; iD
program MainSubtractionFunction;
#include( "stdlib.hhf" );
static
iDataValue1 : int32 := 0;
iDataValue2 : int32 := 0;
DifferenceInt : int32 :=69;
procedure recursiveSubtraction( a: int32; b : int32 ); @nodisplay; @noframe;
static
returnAddress : dword;
value: int32;
begin recursiveSubtraction;
pop( returnAddress );
pop( b );
pop( a );
push( returnAddress );
mov (a, EAX);
mov (b, EBX);
CompareB:
cmp (EBX, 0);
je ExitSequence;
CompareA:
cmp (EAX, 0);
je AEqualsZero;
NeitherEqualZero:
sub (1, EAX);
sub (1, EBX);
push(EAX);
push(EBX);
call recursiveSubtraction;
AEqualsZero:
neg (EBX);
mov (EBX, EAX);
jmp ExitSequence;
BEqualsZero:
jmp ExitSequence;
ExitSequence:
ret();
end recursiveSubtraction;
begin MainSubtractionFunction;
stdout.put( "Feed Me A: " );
stdin.get( iDataValue1 );
stdout.put( "Feed Me B: " );
stdin.get( iDataValue2 );
push( iDataValue1 );
push( iDataValue2 );
call recursiveSubtraction;
mov(EAX, DifferenceInt);
stdout.put("RecursiveSubtraction of A-B = ",DifferenceInt, nl);
stdout.put("EAX = ",EAX, nl);
stdout.put("EBX = ",EBX, nl);
stdout.put("ECX = ",ECX, nl);
end MainSubtractionFunction;
环境
- HLA(高级汇编程序-HLABE后端,POLINK链接器) 版本2.16构建4413(原型)
- 视窗10
- 此问题中的递归算法适用于以下情况:
、正-正
和正-负
,但不适用于负-正
的情况负-负
- 问题是,从递归调用返回到
后,代码将始终按顺序继续到recursivedetraction
标签李>AEqualsZero
- 要解决此问题,请在调用
后再添加一个递归减法
jmp ExitSequence
NeitherEqualZero:
sub(1, EAX);
sub(1, EBX);
push(EAX);
push(EBX);
call recursiveSubtraction;
AEqualsZero:
neg(EBX);
mov(EBX, EAX);
jmp ExitSequence;
NeitherEqualZero:
sub(1, EAX);
sub(1, EBX);
push(EAX);
push(EBX);
call recursiveSubtraction;
jmp ExitSequence;
AEqualsZero:
neg(EBX);
mov(EBX, EAX);
jmp ExitSequence;
program MainSubtractionFunction;
#include("stdlib.hhf");
procedure recursiveSubtraction(A: int32; B: int32); @nodisplay; @noframe;
begin recursiveSubtraction;
pop(EDX); // Return Address
pop(EBX);
pop(EAX);
push(EDX); // Return Address
CompareB:
cmp(EBX, 0);
je ExitSequence;
CompareA:
cmp(EAX, 0);
je AEqualsZero;
NeitherEqualZero:
dec(EAX);
dec(EBX);
push(EAX);
push(EBX);
call recursiveSubtraction;
jmp ExitSequence;
AEqualsZero:
neg(EBX);
mov(EBX, EAX);
jmp ExitSequence;
BEqualsZero:
jmp ExitSequence;
ExitSequence:
ret();
end recursiveSubtraction;
begin MainSubtractionFunction;
stdout.put("Feed Me A: ");
stdin.geti32();
push(EAX);
stdout.put("Feed Me B: ");
stdin.geti32();
push(EAX);
call recursiveSubtraction;
stdout.put("RecursiveSubtraction of A-B = ", (type int32 EAX), nl);
end MainSubtractionFunction;