首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序集代码和开关语句用例

程序集代码和开关语句用例
EN

Stack Overflow用户
提问于 2015-10-19 05:41:31
回答 1查看 2.9K关注 0票数 1

我对如何通过汇编语言来确定案例50,52等有一点困难。

据我所知,跳转表对应于在每种情况下要执行的操作,而edx >5的检查是否意味着情况范围从0到5?我相信1被忽略了,因为它是默认情况,但是为什么5被忽略了呢?

我觉得应该有一个案例55:结果*=的结果是什么,不是吗?

如果有人能帮忙解释的话,那就太好了。谢谢!

int switch_prob(int x) { int结果= x;开关(x) {例50:结果<<= 2;中断;案例53:结果>>= 2;中断;案例54:结果*= 3;中断;默认情况:结果+= 10;}返回结果;} 图3.38显示了该过程的反汇编对象代码。我们只对第4行到第16行显示的代码部分感兴趣。在第4行,我们可以看到参数x(相对于%ebp的偏移量8)被加载到寄存器%eax中,与程序变量结果相对应。第11行的“Lea0x0(%esi),%esi”指令是插入nop指令,使第12行的指令开始于16倍的地址。 跳转表驻留在不同的内存区域。使用调试器GDB,我们可以使用命令x/6w0x8048468检查从地址0x8048468开始的6个4字节内存字。( GDB ) x/6w 0x8048468: 0x080483d5 0x080483eb 0x0483d5 0x0483d5 0x0x8048478: 0x080483e5 0x080483e8 (gdb) 装配守则: 1: 080483c0 :2: 80483c0: push %ebp 3: 80483c1: mov %esp,%ebp 4: 80483c3: mov 0x8(%ebp),%eax // X被复制到eax中;eax =x5: 80483c6: Lea0xffffce(%eax),%edx //占位符6: 80483c9: cmp $0x5,%edx //比较edx (第3次参数)和5;显然,Edx是x7: 80483cc: ja 80483eb //如果edX-5> 0,跳到行16 (默认值) 8: 80483ce: jmp *0x8048468(,% edx ,4) /转到跳转表9: 80483d5: shl $0x2,%eax // eax << 2 10: 80483d8: jmp 80483ee // <<到第17行:80483 ja: lea 0x0( %esi ),% esi / esi =esi NOP。在行17 14: 80483e5: lea ( %eax,% eax,2)、%eax // eax = eax + 2( eax ) 15: 80483e8: imul %eax、%eax / eax 16: 80483eb:添加$0xa、% eax += 1017:80433ee: mov %ebp、%esp / esp = ebp 18: 80483 f0: pop % 19: 803f1:80483fbp:80483bp:ebp %ebp

EN

回答 1

Stack Overflow用户

发布于 2015-10-19 07:07:39

程序集与源代码不匹配。它更像这样的东西:

代码语言:javascript
复制
int switch_prob(int x) 
{
    int result = x;
    switch (x)
    {
        case 50:
        case 52:
            result <<= 2;
            break;
        case 53:
            result >>= 2;
            break;
        case 54:
            result *= 3;
            // WARNING: Falls through
        case 55:
            result *= result;
            // WARNING: Falls through
        default:
            result += 10;   
            break;
    }
    return result;
}

这很可能是人为错误造成的(例如,更新问题中的源代码,使其与去年学生收到的问题不同,但忘记更新程序集以匹配)。

永远不要以为老师/教授是非人类的.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33207339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档