当参数 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