2017-11-10 155 views
0

所以我想了解TBB如何在Assembly中爲switch語句工作。我看到它是如何寫在教科書/在線手冊中的,但我不明白偏移量在分支表中如何工作。 它如何從分支錶轉換爲指令?如何扣除標籤以獲得正確的偏移量,以及爲什麼除以2?ARM大會TBB指令 - 跳躍是如何工作的?

以我教科書它說

到的程序應該 分支如下計算該指令的存儲器地址:
目標= 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?

+2

由於指令地址總是即使是這樣,縮放2倍也是有意義的,所以你會得到兩倍的範圍。另一種看待它的方式是存儲偏移量的#1-8位,而位#0隱含爲零,即二進制中的「XXXXXXXX0」。 – Jester

+0

這很有道理。我記得讀到PC一直因爲對齊而將位[1:0]設置爲0(不記得是16位還是32位指令......)。這也是爲什麼DCB指令通常跟着ALIGN?對不起,你能澄清一下範圍部分嗎? – Pablo

+0

這是32位。至於'DCB',是的。該手冊說:_「如果DCB後面跟着一條指令,請使用ALIGN指令來確保指令對齊。」_('DCB'是指令,而不是指令)。你可以使用的範圍是512個字節而不是256個,如果你天真地使用了一個字節偏移量,你就可以使用這個範圍。 – Jester

回答

0

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

ARM Thumb2指令始終以偶數地址開始。能夠分支到PC+4 + {0, 2, 4, 6, 8, ..., 508, 510}
PC+4 + {0, 1, 2, 3, 4, ..., 254, 255 }更有用,因爲所有的奇數偏移都是無用的。 As @Jester explained in the first comment,乘以2會使您獲得兩倍於單字節偏移量的範圍,而不會損失靈活性。

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

下面是使用TBB,與原十六進制跳轉表的一個真實的例子,並評論拆卸工作了各分支目標是如何達成的數學(如
case 3: (0x3164 + 0x9 * 2)): Confused by TBB in a section of ARM disassembly