什么是汇编语言中的表操作和多向分支

时间:2017-09-21 12:37:38

标签: assembly

我无法在谷歌找到我的答案,我想在汇编语言中找到关于" 表操作多向分支的一些基本信息#34;举个例子

1 个答案:

答案 0 :(得分:0)

unsigned int fun ( unsigned int x )
{
    switch(x&7)
    {
        case 0: return(x<<1); 
        case 1: return(2); 
        case 2: return(x>>1); 
        case 3: return(x+x); 
        case 4: return(x&3); 
        case 5: return(x+(x<<1)); 
        case 6: return(5); 
        case 7: return(x+x+x); 
    }
}

一种实施方式。

00000000 <fun>:
   0:   e2003007    and r3, r0, #7
   4:   e2433001    sub r3, r3, #1
   8:   e3530006    cmp r3, #6
   c:   979ff103    ldrls   pc, [pc, r3, lsl #2]
  10:   ea000006    b   30 <fun+0x30>
  14:   00000040    andeq   r0, r0, r0, asr #32
  18:   00000050    andeq   r0, r0, r0, asr r0
  1c:   00000030    andeq   r0, r0, r0, lsr r0
  20:   00000048    andeq   r0, r0, r8, asr #32
  24:   00000038    andeq   r0, r0, r8, lsr r0
  28:   00000058    andeq   r0, r0, r8, asr r0
  2c:   00000038    andeq   r0, r0, r8, lsr r0
  30:   e1a00080    lsl r0, r0, #1
  34:   e12fff1e    bx  lr
  38:   e0800080    add r0, r0, r0, lsl #1
  3c:   e12fff1e    bx  lr
  40:   e3a00002    mov r0, #2
  44:   e12fff1e    bx  lr
  48:   e2000003    and r0, r0, #3
  4c:   e12fff1e    bx  lr
  50:   e1a000a0    lsr r0, r0, #1
  54:   e12fff1e    bx  lr
  58:   e3a00005    mov r0, #5
  5c:   e12fff1e    bx  lr

程序计数器以编程方式计算,因此基于输入,可以根据输入和数学在任何一个位置着陆。 (很好的捕获优化我试图不要有任何直接重复的情况,但没有尝试那么难)