Assembly 汇编语言中的表操作和多路分支是什么
我在google中找不到我的答案,我想通过一个例子了解汇编语言中的表操作和多路分支的一些基本信息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);
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是的,我正在读那本书,奥奥斯·杰斯特说这可能是一个开关的跳台。断章取义,还有什么其他方法可以进行多路分支?可以通过数学方式为可以这样做的指令集生成一个程序计数器,也可以为允许这样做的指令集生成一个跳转表,或者在本例中是两者的组合。好的,这些话还能意味着什么?这是一个给他们鱼的答案,每当我在这里教他们钓鱼的时候,我都会被打。。。