Arm 解释跳转表/分支表

Arm 解释跳转表/分支表,arm,Arm,我一直在慢慢地学习组装。我正在研究佳能反叛T1i,这里是一个代码流程图的小片段,我正在努力理解。据我所知,我相信这款相机有一个132MHz的ARM v5处理器: 我已经搜索了谷歌的底部,试图了解跳转表是如何工作的,无论我读了多少书,我都无法将这些东西联系起来理解它。我知道跳转表类似于case语句,但我不知道它是如何在表中移动的 在这个例子中,只有一个CMP操作,所以我不明白它到底是如何工作的。任何帮助都将不胜感激 我认为你在屏幕截图上没有足够的信息来理解它是如何与你的问题联系在一起的。但是一张

我一直在慢慢地学习组装。我正在研究佳能反叛T1i,这里是一个代码流程图的小片段,我正在努力理解。据我所知,我相信这款相机有一个132MHz的ARM v5处理器:

我已经搜索了谷歌的底部,试图了解跳转表是如何工作的,无论我读了多少书,我都无法将这些东西联系起来理解它。我知道跳转表类似于case语句,但我不知道它是如何在表中移动的


在这个例子中,只有一个CMP操作,所以我不明白它到底是如何工作的。任何帮助都将不胜感激

我认为你在屏幕截图上没有足够的信息来理解它是如何与你的问题联系在一起的。但是一张跳台总的来说

在C语言中,想象一个函数数组,您已经初始化了函数数组中的每个元素,稍后您的代码会做出一些决定,并使用索引来选择其中一个函数。正如您提到的case语句,可以通过这种方式实现,但这将是例外而不是规则,这一切都取决于开关中使用的变量以及case语句中元素的大小/宽度/性质

你一直在学习汇编,所以你了解寄存器,用寄存器做数学运算,在寄存器中存储东西,等等。程序计数器可以被许多指令用作另一个寄存器,不同的是当你向它写入一些东西时,你改变了下一步执行的指令

让我们尝试一个case语句示例:

switch(bob&3)
{
   case 0: ted(); break;
   case 1: joe(); break;
   case 2: jim(); bob=2; break;
   case 3: tim(); bob=7; break;
}
您可以(可能不会)做的是:

因此,标签casetable后面的四个单词:是每个案例的代码开始的地址,case0从a开始,case1从b开始,依此类推。我们需要做的是获取switch语句使用的变量,并从数学上计算表中项的地址。然后我们需要将表中的地址加载到程序计数器中。写入程序计数器与执行跳转相同


因此,C样本是精心制作的,目的是使其变得简单。首先将bob变量的内容加载到r0中。和3。跳转表中的项目是32位地址,或4字节,因此我们需要将r0乘以4,以获得表中的偏移量。左移2等于乘以4。我们需要添加R0谢谢!!!这一切现在都让人觉得很重要,特别感谢你解释ADDLS是“如果小于或相同,则添加”,现在就有意义了。
casetable:
     .word a
     .word b
     .word c
     .word d

    caseentry:
      ldr r1,=bob
      ldr r0,[r1]
      ldr r2,=casetable
      and r0,#3
      ldr pc,[r2,r0,lsl #2] 

    a:
      bl ted
      b caseend
    b:
      bl joe
      b caseend
    c:
      bl jim
      mov r0,#2
      ldr r1,=bob
      str r0,[r1]  
      b caseend
    d:
      bl tim
      mov r0,#7
      ldr r1,=bob
      str r0,[r1]
      b caseend

    caseend:
ldr pc,[r2,r0,lsl #2]
   mov r3,r0,lsl #2
   add r3,r2
   bx r3
cmp r0,#4
addls pc,pc,r0,lsl #2
cmp r0,#4
addls pc,pc,r0,lsl #2
ldr pc,=a
ldr pc,=b
ldr pc,=c
ldr pc,=d
...