【问题标题】:Confused by TBB in a section of ARM disassemblyARM拆解一段被TBB迷惑
【发布时间】:2011-08-11 22:44:56
【问题描述】:

作为学习 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

我相信它可能是某种 switch 语句,但我不确定它到底在做什么

【问题讨论】:

标签: assembly arm disassembly


【解决方案1】:

是的,那是一个开关。 tbb 代表 Table Branch Byte,它采用一个字节偏移表,其基数为pc,索引为r0,并使用它进行分支。

所以:

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

基本思路要清楚。

【讨论】:

  • 我的猜测是在发布的代码上方有一个范围检查,如果 r0 >= 6 则分支到 0x317e...
  • 谢谢,这很有道理,但我不明白你从哪里得到所有这些。我以前从未见过“tbb”,也不明白你是如何从我发布的内容中得到的。如果 r0 > 5 则有一个范围检查分支到 ox317e
  • 做得很好。在格式化/注释/间距和显示偏移表和每个案例之间的关系方面做得很好。
  • @Johnathon - the TBB instruction 已添加到 Thumb-2 指令集中。我认为 ninjalj 的解释是经过深思熟虑且评论良好的。你能说得更清楚一些,告诉我们你不明白的地方吗?
  • @Johnathon:第 2 列中的值是内存中的实际字节数。 ninjalj 所说的问题是它们不是指令,它们是数据(ARM 有时会这样做),但反汇编程序正试图将它们解码为指令。想象一下,如果反汇编程序试图反汇编“你好,先生,你今天好吗?”中的字节。 - 它会输出 something,但它没有意义,因为这些字符不是 ARM 汇编指令。
猜你喜欢
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多