簡體   English   中英

ARM Assembly TBB指令-跳躍如何工作?

[英]ARM Assembly TBB Instruction - how does jumping work?

因此,我試圖了解TBB如何在Assembly中用於switch語句。 我在教科書/在線手冊中看到了它的寫法,但是我不明白偏移量在分支表中是如何工作的。 它如何從分支表到指令? 如何減去標簽以獲得正確的偏移量,為什么要除以2?

在我的教科書中說

程序應跳轉到的指令的內存地址計算如下:
目標= PC + 4 +(2 * BranchTable [r0])

其中r0是包含分支表內偏移量的計數器。 在TBB上,PC已指向下一條指令(分支表,PC = PC + 4)。 分支表應該向適當的指令(2 * BranchTable [r0])加載第二個偏移量。 從我在教科書和網上看到的內容中,分支表標簽從指令標簽中減去。 這應該提供約4n的偏移量。 為什么要除以2? 謝謝!

編輯:做了一些數學

所以我做了一些數學運算,結果發現分支表中的偏移量是[(label2-label1)/ 2]。 較早地插入方程式中,可以得出target = PC + 4 +(標簽2-標簽)。 這是有道理的,但我仍然想知道是否有人有原因,或者我的邏輯是否錯誤-為什么將TBB設置為除以2 /乘以2?

TBB / TBH僅在Thumb2模式下可用。

ARM Thumb2指令始終從偶數地址開始。 能夠分支到PC+4 + {0, 2, 4, 6, 8, ..., 508, 510}
PC+4 + {0, 1, 2, 3, 4, ..., 254, 255 } ,因為所有奇數偏移量都是無用的。 正如@Jester在第一條評論中所解釋的那樣 ,乘以2 將使您從一個字節的偏移量到范圍的兩倍,而不會損失靈活性。

ARM的設計人員本可以將其設計為始終乘以4,但是512B通常是足夠的范圍,並且有時需要填充代碼塊為4字節長的倍數。 如果需要更大的偏移量,則TBH使用半字16位偏移量(仍乘以2)。

這是一個使用TBB的跳轉表的真實示例,原始的十六進制和注釋的反匯編計算出如何達到每個分支目標的數學方法(例如
case 3: (0x3164 + 0x9 * 2) ): 在ARM拆卸的一部分中被TBB混淆

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM