Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
汇编代码和Switch语句案例_C_Assembly_Switch Statement_Jump Table - Fatal编程技术网

汇编代码和Switch语句案例

汇编代码和Switch语句案例,c,assembly,switch-statement,jump-table,C,Assembly,Switch Statement,Jump Table,我在理解案例50、52等是如何通过汇编语言确定的方面有点困难 据我所知,跳转表对应于每种情况下要执行的操作,检查edx>5意味着情况范围为0到5?我认为1被遗漏了,因为这是默认情况,但为什么5被遗漏了呢 我觉得应该有一个案例55:where result*=result,no 如果有人能帮忙解释,那就太好了。谢谢大家! 汇编代码: 1: 080483c0 <switch_prob>: 2: 80483c0: push %ebp 3: 80483c1: mov %esp,%ebp 4:

我在理解案例50、52等是如何通过汇编语言确定的方面有点困难

据我所知,跳转表对应于每种情况下要执行的操作,检查edx>5意味着情况范围为0到5?我认为1被遗漏了,因为这是默认情况,但为什么5被遗漏了呢

我觉得应该有一个案例55:where result*=result,no

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

汇编代码:

1: 080483c0 <switch_prob>:
2: 80483c0: push %ebp
3: 80483c1: mov %esp,%ebp
4: 80483c3: mov 0x8(%ebp),%eax // X is copied into eax ; eax = x
5: 80483c6: lea 0xffffffce(%eax),%edx // placeholder 
6: 80483c9: cmp $0x5, %edx // Compare edx (3rd argument) with 5; Edx - 5 // clearly, edx is x
7: 80483cc: ja 80483eb <switch_prob+0x2b> // if edx - 5 > 0, Jump into line 16 (default)
8: 80483ce: jmp *0x8048468(,%edx,4) // Go into the jump table
9: 80483d5: shl $0x2, %eax // eax << 2
10: 80483d8: jmp 80483ee <switch_prob+0x2e> // Jump to line 17
11: 80483da: lea 0x0(%esi),%esi // esi = esi  NOP. Filling in N bytes
12: 80483e0: sar $0x2, %eax // eax >> 2
13: 80483e3: jmp 80483ee <switch_prob+0x2e> // Jump to line 17
14: 80483e5: lea (%eax, %eax, 2), %eax // eax = eax + 2(eax)
15: 80483e8: imul %eax, %eax // eax *= eax
16: 80483eb: add $0xa, %eax // eax += 10
17: 80483ee: mov %ebp, %esp // esp = ebp
18: 80483f0: pop %ebp
19: 80483f1: ret
1:080483c0:
2:80483c0:push%ebp
3:80483c1:mov%esp,%ebp
4:80483c3:mov0x8(%ebp),%eax//X被复制到eax中;eax=x
5:80483c6:lea 0xffffffce(%eax),%edx//占位符
6:80483c9:cmp$0x5,%edx//比较edx(第三个参数)和5;Edx-5//显然,Edx就是x
7:80483cc:ja 80483eb//如果edx-5>0,跳转到第16行(默认)
8:80483ce:jmp*0x8048468(,%edx,4)//进入跳转表
9:80483d5:shl$0x2,%eax//eax>2
13:80483e3:jmp 80483ee//跳到第17行
14:80483e5:lea(%eax,%eax,2),%eax//eax=eax+2(eax)
15:80483e8:imul%eax,%eax//eax*=eax
16:80483eb:添加$0xa,%eax//eax+=10
17:80483ee:mov%ebp,%esp//esp=ebp
18:80483f0:pop%ebp
19:80483f1:ret

程序集与源代码不匹配。它与以下内容相匹配:

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;
}
int开关_prob(int x)
{
int结果=x;
开关(x)
{
案例50:
案例52:
结果=2;
打破
案例54:
结果*=3;
//警告:发生故障
案例55:
结果*=结果;
//警告:发生故障
违约:
结果+=10;
打破
}
返回结果;
}
这可能是人为错误造成的(例如,更新问题中的源代码,使其与去年学生的问题不同,但忘记更新程序集以匹配)


永远不要假设教师/教授不是人类……

程序集与源代码不匹配。它与以下内容相匹配:

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;
}
int开关_prob(int x)
{
int结果=x;
开关(x)
{
案例50:
案例52:
结果=2;
打破
案例54:
结果*=3;
//警告:发生故障
案例55:
结果*=结果;
//警告:发生故障
违约:
结果+=10;
打破
}
返回结果;
}
这可能是人为错误造成的(例如,更新问题中的源代码,使其与去年学生的问题不同,但忘记更新程序集以匹配)


永远不要假设教师/教授是非人类的…

好吧,你的开关中有五个案例。既然案例5对应于0x80483e8,我不应该有6个吗@JoachimPileborgZero计数,从
0
5
(含)共有六个数字:@约阿希姆皮勒堡。是的,但从我的例子来看,违约率只有50、52、53、54和51。它不见了?或者,正如您可能知道的,
lea0xffffffce(%eax),%edx
有效地将-50(十进制)添加到eax(变量x)中,并将其存储在edx(edx=-50+x)中。您的开关中确实有五个案例。既然案例5对应于0x80483e8,我不应该有6吗@JoachimPileborgZero计数,从
0
5
(含)共有六个数字:@约阿希姆皮勒堡。是的,但从我的例子来看,违约率只有50、52、53、54和51。它不见了?或者,正如您可能知道的,
lea0xffffffce(%eax),%edx
有效地将-50(十进制)添加到eax(变量x)并存储在edx(edx=-50+x)中。我同意人为错误,听起来提供的答案不正确(答案可能基于上学期的类似练习,没有适当更新)谢谢!这更有意义。问题也来自哈佛大学的作业Lol@Crowning:您已经成为会员一段时间了,对于您的各种问题,您都得到了一些很好的答案。到目前为止,您可能想接受其中的一些问题:。也许您也应该花些时间阅读介绍性文章。(不用担心,它很短!很友好!信息丰富!它会在你的个人资料上为你赢得一枚徽章!)我同意人为错误,听起来提供的答案不正确(答案可能是基于上学期的类似练习,没有正确更新)谢谢!这更有意义。问题也来自哈佛大学的作业Lol@Crowning:您已经成为会员一段时间了,对于您的各种问题,您都得到了一些很好的答案。到目前为止,您可能想接受其中的一些问题:。也许您也应该花些时间阅读介绍性文章。(不用担心,它很短!很友好!信息丰富!它会在你的个人资料上为你赢得一枚徽章!)
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;
}