繁体   English   中英

程序集中的switch语句

[英]switch statement in assembly

我试图了解switch语句如何在汇编中工作,我有以下程序:

int main (int argc, char **argv)
{
    int     x = argc > 1 ? atoi(argv[1]) : 2;
    int     y;

    switch (x) {
        case 0:
            y = 0;
            break;
        case 1:
            y = 1;
            break;
        case 2:
            y = 2;
            break;
        case 3:
            y = 3;
            // this case "drops through"
        case 4:
            y = 4;
            break;
        default:
            y = -1;
            break;
        }

    return 0;
}

在装配中它看起来像:

0x804842f <main+19>     cmpl   $0x1,(%eax)
0x8048432 <main+22>     jle    0x804844a <main+46>                                                                                          
0x8048434 <main+24>     mov    0x4(%eax),%eax
0x8048437 <main+27>     add    $0x4,%eax
0x804843a <main+30>     mov    (%eax),%eax
0x804843c <main+32>     sub    $0xc,%esp
0x804843f <main+35>     push   %eax
0x8048440 <main+36>     call   0x8048310 <atoi@plt>
0x8048445 <main+41>     add    $0x10,%esp
0x8048448 <main+44>     jmp    0x804844f <main+51>
0x804844a <main+46>     mov    $0x2,%eax
0x804844f <main+51>     mov    %eax,-0xc(%ebp)
0x8048452 <main+54>     cmpl   $0x4,-0xc(%ebp)
0x8048456 <main+58>     ja     0x8048492 <main+118>
0x8048458 <main+60>     mov    -0xc(%ebp),%eax
0x804845b <main+63>     shl    $0x2,%eax
0x804845e <main+66>     add    $0x8048540,%eax       

我的第一个问题是为什么在<main+58>ja指令,而不是jg ,因为我们使用的是有符号整数。 第二个问题是为什么在<main+63>有2位而不是任何其他值。

ja是将两个签名支票折叠成单个无符号支票的技巧。 if (x > 4 || x < 0) ,那么通过的唯一事情就是预期的0-4。

2位的移位是指针大小的缩放。 你已经切断了反汇编的下一部分,我很确定你会看到间接跳过表格。 该表保存大小为4的指针(在您的体系结构上),因此索引应缩放4,这是2位的移位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM