Assembly 在臂拆卸部分被TBB弄糊涂了
作为学习Arm汇编的入门,我试图用更高级的语言重新创建反汇编函数。然而,我被下面的组装弄糊涂了: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
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