小编pet*_*rov的帖子

静态(词法)范围与动态范围(伪代码)

Program A()
{
    x, y, z: integer;

    procedure B()
    {
        y: integer;
        y=0;
        x=z+1;
        z=y+2;
    }

    procedure C()
    {
        z: integer;

        procedure D()
        {
            x: integer;
            x = z + 1;
            y = x + 1;
            call B();
        }

        z = 5;
        call D();
    }

    x = 10;
    y = 11;
    z = 12;
    call C();
    print x, y, z;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,使用静态作用域运行时该程序的结果是:x = 13,y = 7,z = 2.

但是,当使用动态范围运行时,结果为:x = 10,y = 7,z = 12.

这些结果是我们教授给我们的结果.但是,我无法理解他的生活如何达到这些结果.有人可能会通过伪代码并在两种不同类型的范围内解释它们的值吗?

scope pseudocode output

57
推荐指数
2
解决办法
4万
查看次数

二进制炸弹 - 第4阶段

我正在非常困难地追踪下面的二进制炸弹的汇编代码(从学校分配炸弹必须被拆除,这个炸弹包含6个阶段,所有阶段都有1个正确的输入以进入下一个阶段).我目前在phase_4上,它有一个名为func4的递归函数.我已经确定输入是"%d%d",这是两个整数.但是,即使在每个步骤中获取所有寄存器的信息之后,我也无法弄清楚func4正在做什么.

Phase_4:

    (gdb) disas
Dump of assembler code for function phase_4:
=> 0x08048e24 <+0>: sub    $0x2c,%esp
   0x08048e27 <+3>: lea    0x1c(%esp),%eax
   0x08048e2b <+7>: mov    %eax,0xc(%esp)
   0x08048e2f <+11>:    lea    0x18(%esp),%eax
   0x08048e33 <+15>:    mov    %eax,0x8(%esp)
   0x08048e37 <+19>:    movl   $0x804a7f1,0x4(%esp)
   0x08048e3f <+27>:    mov    0x30(%esp),%eax
   0x08048e43 <+31>:    mov    %eax,(%esp)
   0x08048e46 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt>
   0x08048e4b <+39>:    cmp    $0x2,%eax
   0x08048e4e <+42>:    jne    0x8048e5d <phase_4+57>
   0x08048e50 <+44>:    mov    0x18(%esp),%eax
   0x08048e54 <+48>:    test   %eax,%eax
   0x08048e56 <+50>:    js     0x8048e5d <phase_4+57>
   0x08048e58 <+52>:    cmp    $0xe,%eax
   0x08048e5b <+55>:    jle    0x8048e62 <phase_4+62> …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gdb reverse-engineering

5
推荐指数
1
解决办法
3万
查看次数

标签 统计

assembly ×1

gdb ×1

output ×1

pseudocode ×1

reverse-engineering ×1

scope ×1

x86 ×1