Assembly 在臂拆卸部分被TBB弄糊涂了

Assembly 在臂拆卸部分被TBB弄糊涂了,assembly,arm,disassembly,Assembly,Arm,Disassembly,作为学习Arm汇编的入门,我试图用更高级的语言重新创建反汇编函数。然而,我被下面的组装弄糊涂了: 0000315e 2101 movs r1, #1 00003160 e8dff000 tbb [pc, r0] 00003164 030e lsls r6, r1, #12 00003166 0907 lsrs r7, r0, #4 00003168 050b lsls r3, r1

作为学习Arm汇编的入门,我试图用更高级的语言重新创建反汇编函数。然而,我被下面的组装弄糊涂了:

0000315e        2101    movs    r1, #1
00003160    e8dff000    tbb [pc, r0]
00003164        030e    lsls    r6, r1, #12
00003166        0907    lsrs    r7, r0, #4
00003168        050b    lsls    r3, r1, #20
0000316a        2106    movs    r1, #6
0000316c        e008    b.n 0x3180
0000316e        2102    movs    r1, #2
00003170        e006    b.n 0x3180
00003172        2103    movs    r1, #3
00003174        e004    b.n 0x3180
00003176        2104    movs    r1, #4
00003178        e002    b.n 0x3180
0000317a        2105    movs    r1, #5
0000317c        e000    b.n 0x3180
0000317e        2100    movs    r1, #0
00003180        4608    mov r0, r1
00003182        4770    bx  lr

我相信这可能是一种切换语句,但我不确定它到底在做什么

是的,这是一种切换
tbb
代表表分支字节,它采用字节偏移量表,基为
pc
,索引为
r0
,并使用该表进行分支

因此:


基本思想应该很清楚。

我猜在发布的代码上方会有一个范围检查,如果r0>=6,它会分支到0x317e……谢谢,这是有道理的,但我不明白你从哪里得到这些。我以前从未见过“tbb”,也不明白你是如何从我的帖子中得到你所拥有的。如果r0>5做得很好,有一个范围检查分支到ox317e。在格式化/注释/间距方面做得很好&显示偏移量表和每个大小写之间的关系。@Johnathon-被添加到Thumb-2指令集中。我认为ninjalj的解释是经过深思熟虑的&评论得很好。你能说得更清楚些吗?告诉我们你不明白什么?@Johnathon:第2列中的值是内存中的实际字节。正如ninjalj所说,问题在于它们不是指令,而是数据(ARM有时会这样做),但反汇编程序正试图将它们解码为指令。想象一下,如果反汇编程序试图反汇编“您好,先生,您今天好吗?”中的字节-它将输出一些内容,但没有意义,因为这些字符不是ARM汇编指令。另请参阅:获取switch语句的68k版本。
0000315e        2101    movs    r1, #1           ; ret = default value
00003160    e8dff000    tbb [pc, r0]             ; switch (r0)

; jump table, byte-sized offsets
00003164        03 0e 09 07 05 0b

; case 1: (0x3164 + 0x3 * 2)
0000316a        2106    movs    r1, #6           ; ret = 6
0000316c        e008    b.n 0x3180               ; break

; case 5: (0x3164 + 0x5 * 2)
0000316e        2102    movs    r1, #2           ; ret = 2
00003170        e006    b.n 0x3180               ; break

; case 2: (0x3164 + 0x7 * 2)
00003172        2103    movs    r1, #3
00003174        e004    b.n 0x3180

; case 3: (0x3164 + 0x9 * 2)
00003176        2104    movs    r1, #4
00003178        e002    b.n 0x3180

; case 4: (0x3164 + 0xb * 2)
0000317a        2105    movs    r1, #5
0000317c        e000    b.n 0x3180

; default:
0000317e        2100    movs    r1, #0

; case 0: (0x3164 + 0xe * 2)
: end switch
00003180        4608    mov r0, r1        ; mov ret to r0 (return value)
00003182        4770    bx  lr            ; return