Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/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
Assembly 开关盒汇编语言_Assembly_X86_Switch Statement_Disassembly - Fatal编程技术网

Assembly 开关盒汇编语言

Assembly 开关盒汇编语言,assembly,x86,switch-statement,disassembly,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 804

我正在查看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
我的解释是:

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;
}
int结果=x;
开关(n){
案例:
x=x>2
打破
案例:
x=4*x;
x=x*x
大小写:\默认值
x+=0xa
返回x;
}
我只是不知道如何查找跳转表,并确定32到37之间的n值适合哪一个空格

任何帮助都将不胜感激。
谢谢。

正如奥利所说,没有更多的事情要做了<代码>n-50存储在%edx中,然后开关+0x11跳转到
0x80485d0+%edx*4
中存储的地址。看看表,当n==50或52时为开关+0x18,当n==51时为开关+0x28,当n==53时为开关+0x1d,当n==54时为开关+0x22,当n==55时为开关+0x25。

跳转表有6个值,其中5个是不同的(因此,有5种情况,包括默认值0x8048448)。第一个和第三个(对应于0x32和0x34)用于第一种情况,第二个(0x33)用于最后一种(第五种)情况,第四个(0x35)用于第二种情况,第五个(0x36)用于第三种情况,第六个(0x37)用于第四种情况。其他所有内容都转到最后一个(第五个)案例,使其成为默认情况

switch (n)
{
  case 0x32:
  case 0x34:
    x <<= 2;
    break;
  case 0x35:
    x >>= 2;
    break;
  case 0x36:
    x *= 3;
  case 0x37:
    x *= x;
  //case 0x33:  // not really necessary
  default:
    x += 10;
}
return x;
开关(n)
{
案例0x32:
案例0x34:
x=2;
打破
案例0x36:
x*=3;
案例0x37:
x*=x;
//案例0x33://实际上没有必要
违约:
x+=10;
}
返回x;

注意
0x32
是50,不是32。我不确定我是否理解这个问题;你已经完成了艰苦的工作!跳转表的第一个元素对应于
0x32
,第二个元素对应于
0x33
,依此类推。
x=4*x
不应该是
x=3*x
(或者更准确地说,
x=x+2*x
)吗?
switch (n)
{
  case 0x32:
  case 0x34:
    x <<= 2;
    break;
  case 0x35:
    x >>= 2;
    break;
  case 0x36:
    x *= 3;
  case 0x37:
    x *= x;
  //case 0x33:  // not really necessary
  default:
    x += 10;
}
return x;