gpt4 book ai didi

c - 汇编中的 switch 语句

转载 作者:行者123 更新时间:2023-11-30 23:57:44 28 4
gpt4 key购买 nike

我正在尝试了解 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

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

最佳答案

ja是将两张签名支票折叠成一张未签名支票的技巧。这有效地做到了if (x > 4 || x < 0) ,所以唯一通过的就是 0-4 符合预期。

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

关于c - 汇编中的 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com