当参数 0x7 和 0x18 时,这个程序的输出是什么
What is the output of this program when the parameters 0x7 and 0x18
我有如下汇编程序
asm2:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: sub esp,0x10
<+6>: mov eax,DWORD PTR [ebp+0xc]
<+9>: mov DWORD PTR [ebp-0x4],eax
<+12>: mov eax,DWORD PTR [ebp+0x8]
<+15>: mov DWORD PTR [ebp-0x8],eax
<+18>: jmp 0x50c <asm2+31>
<+20>: add DWORD PTR [ebp-0x4],0x1
<+24>: add DWORD PTR [ebp-0x8],0xcc
<+31>: cmp DWORD PTR [ebp-0x8],0x3937
<+38>: jle 0x501 <asm2+20>
<+40>: mov eax,DWORD PTR [ebp-0x4]
<+43>: leave
<+44>: ret
据我所知,这会运行一个循环来检查第二个参数是否等于 0x3937 (14647)。如果小于,则第二个参数加 204,第一个参数加 1。我写了一个 C 程序来执行此操作,如下所示,但是当我获取其中一个参数,将它们转换为十六进制,然后提交时,它说这是错误的。
#include <stdio.h>
int main() {
int i = 0;
int a = 7;
int b = 24;
while(b < 14647) {
a += 1;
b += 204;
}
printf("%d %d", a, b);
return 0;
}
asm2
不打印任何东西,它只是将 b
的最终值(在下面的程序中)写入 eax
并停止,这意味着它 returns b
:
int asm2(int a1, int b1)
{
int a; //DWORD PTR [ebp-0x8]
int b; //DWORD PTR [ebp-0x4]
a = a1; // (a = b1 if arguments are pushed from left to right)
b = b1; // (b = a1 if arguments are pushed from left to right)
while(a <= 14647) {
b += 1;
a += 204;
}
return b;
}
因此,如果您调用 asm2(0x7, 0x18)
和
-如果参数从右向左推,它 returns 96
-如果参数从左向右推,它 returns 79
我有如下汇编程序
asm2:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: sub esp,0x10
<+6>: mov eax,DWORD PTR [ebp+0xc]
<+9>: mov DWORD PTR [ebp-0x4],eax
<+12>: mov eax,DWORD PTR [ebp+0x8]
<+15>: mov DWORD PTR [ebp-0x8],eax
<+18>: jmp 0x50c <asm2+31>
<+20>: add DWORD PTR [ebp-0x4],0x1
<+24>: add DWORD PTR [ebp-0x8],0xcc
<+31>: cmp DWORD PTR [ebp-0x8],0x3937
<+38>: jle 0x501 <asm2+20>
<+40>: mov eax,DWORD PTR [ebp-0x4]
<+43>: leave
<+44>: ret
据我所知,这会运行一个循环来检查第二个参数是否等于 0x3937 (14647)。如果小于,则第二个参数加 204,第一个参数加 1。我写了一个 C 程序来执行此操作,如下所示,但是当我获取其中一个参数,将它们转换为十六进制,然后提交时,它说这是错误的。
#include <stdio.h>
int main() {
int i = 0;
int a = 7;
int b = 24;
while(b < 14647) {
a += 1;
b += 204;
}
printf("%d %d", a, b);
return 0;
}
asm2
不打印任何东西,它只是将 b
的最终值(在下面的程序中)写入 eax
并停止,这意味着它 returns b
:
int asm2(int a1, int b1)
{
int a; //DWORD PTR [ebp-0x8]
int b; //DWORD PTR [ebp-0x4]
a = a1; // (a = b1 if arguments are pushed from left to right)
b = b1; // (b = a1 if arguments are pushed from left to right)
while(a <= 14647) {
b += 1;
a += 204;
}
return b;
}
因此,如果您调用 asm2(0x7, 0x18)
和
-如果参数从右向左推,它 returns 96
-如果参数从左向右推,它 returns 79