assembly - Switch Case 汇编语言

标签 assembly x86 switch-statement disassembly

我正在查看 switch 语句的汇编语言代码。

我了解代码的工作原理以及情况。我的问题是如何决定案例名称?

下面是汇编语言代码,下面是我的解释。我基本上只需要使用跳转表并填写案例名称。

    1 8048420: push %ebp
    2 8048421: mov %esp, $ebp
    3 8048423: mov 0x8(%ebp), %eax       // x
    4 8048426: mov 0xc(%ebp), %edx       // n
    5 8048429: sub $0x32, %edx           // so least value of case is 32
    6 804842c: cmp $0x5, %edx            // max value is 37
    7 804842f: ja 8048448 <switch+0x28>  // if >37, go to default
    8 8048431: jmp *0x80485d0(, %edx, 4)  //THIS RIGHT HERE ?
    9 8048438: shl $0x2, %eax             // CASE A
   10 804843b: jmp 804844b <switch+0x2b>  //break;
   11 804843d: sar $0x2, %eax             //CASE B
   12 8048440: jmp 804844b <switch+0x2b>  //break
   13 8048442: lea (%eax, %eax, 2), %eax  //CASE C
   14 8048445: imul %eax, %eax     
   15 8048448: add $0xa, %eax             //fall through to default
   16 804844b: pop %ebp                   //return
   17 804844c: ret

gdb命令创建的跳转表: 我正在做 x/6w 0x80485d0

0x80485d0: 0x08048438 0x08048448 0x08048438 0x0804843d
0x80485e0: 0x08048442 0x08048445

我的解读:

int result = x;
switch(n) {
case __:
    x = x << 2;
    break;  
case __:
    x = x >> 2
    break;
case __:
    x = 4*x;
    x = x*x
case __: //default
    x += 0xa 
return x;
}

我只是不明白如何查找跳转表并确定 32 到 37 之间的哪些 n 值适合哪个 case 空白。

如有任何帮助,我们将不胜感激。 谢谢。

最佳答案

正如奥利所说,没有什么可做的了。 n-50存储在%edx中,然后switch+0x11跳转到0x80485d0 + %edx * 4存储的地址。查看表格,当 n==50 或 52 时为 switch+0x18,当 n==51 时为 switch+0x28,当 n==53 时为 switch+0x1d,当 n==54 时为 switch+0x22,当 n= 时为 switch+0x25 =55。

关于assembly - Switch Case 汇编语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008539/

相关文章:

assembly - Shellcode:非法指令

gcc - 什么 '__asm__(".previous");'意思?

x86 - 最近英特尔微架构中的简单解码器可以处理所有 1-µop 指令吗?

c - 在不是地址/指针的值上使用LEA吗?

c++ - 用于具有不同签名的函数的枚举切换器

c - 从 C 到汇编

c 库 x86/x64 汇编程序

将CPU切换到用户模式和内核模式的汇编指令?

Php Mysql 开关/案例声明

java - Switch 语句 请帮助我