Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 - Fatal编程技术网

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

Assembly 汇编语言中的表操作和多路分支是什么,assembly,Assembly,我在google中找不到我的答案,我想通过一个例子了解汇编语言中的表操作和多路分支的一些基本信息 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);

我在google中找不到我的答案,我想通过一个例子了解汇编语言中的表操作和多路分支的一些基本信息

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

程序计数器是根据输入以编程方式计算的,因此可以根据输入和数学在这些位置中的任何一个着陆。很好的优化技巧我一直在努力避免出现任何直接重复的情况,但没有那么努力

你能提供更多的上下文吗?似乎OP引用了William Stallings的《计算机组织与体系结构》第11.3节的指令格式,正如所发现的。多路分支可能是一个跳转表,例如,一个开关实现。@MargaretBloom即使我不知道上下文,这也是我问它的原因here@RuudHelderman是的,我正在读那本书,奥奥斯·杰斯特说这可能是一个开关的跳台。断章取义,还有什么其他方法可以进行多路分支?可以通过数学方式为可以这样做的指令集生成一个程序计数器,也可以为允许这样做的指令集生成一个跳转表,或者在本例中是两者的组合。好的,这些话还能意味着什么?这是一个给他们鱼的答案,每当我在这里教他们钓鱼的时候,我都会被打。。。