我正在學習通過匯編考試,我們應該解釋提供的沒有注釋或任何內容的匯編源檔案,這是一項我覺得特別困難的任務。我的問題是,在這些情況下,我認為在專業環境中經常發生這種情況,是否有線索可以確定程式的流程和目的是什么。我能夠通過分支和跳轉指令識別回圈,但除此之外沒有太多其他內容,而且我似乎無法在網上找到任何合適的來源。我將在這里發布一個示例程式以供參考,這是我目前遇到的困難,以防有人想指出一些事情。
.data
data_: .byte 20, -40, -80
pow_: .alloc 804
d: .alloc 8
.global main
main:
sub:
MOV r0, #-100
MOV r2, #-1
EOR r1, r2, r0
ADD r1, r1, #1
LDR r2, =data_
ADR r9, d
ADR r8, pow_
LDRB r3, [r2]
LDRB r4, [r2, #1]
LDRB r5, [r2, #2]
mpt:
MUL r6, r0, r0
MUL r6, r3, r6
MUL r7, r0, r4
ADD r6, r5, r6
ADD r6, r7, r6
STR r6, [r8]
CMP r0, #-100
BGT aft
r:
STR r6, [r9, #4]
STR r0, [r9]
cyc:
ADD r8, r8, #4
ADD r0, r0, #1
CMP r0, r1
BLE mpt
MOV r15, r14
aft:
LDR r2, [r9, #4]
CMP r6, r2
BLT r
B cyc
此代碼是 ARM7,.alloc 指令不是真正的指令,但它只是表示在提供的別名下分配 n 位。據我了解,該程式試圖在保持迭代計數器的同時執行某種回圈,但我無法理解為什么那里有一個 EOR,它轉換為 #-100 和 #-1 到 # 99
歡迎任何形式的建議
uj5u.com熱心網友回復:
您可以將每條匯編指令轉換為某種高級形式,并將它們簡化為更簡單的形式。看看下面翻譯你的例子mpt,你就會明白基本的想法。
mpt:
MUL r6, r0, r0
MUL r6, r3, r6
MUL r7, r0, r4
ADD r6, r5, r6
ADD r6, r7, r6
STR r6, [r8]
CMP r0, #-100
BGT aft
首先,逐行翻譯。
r6 = r0 * r0
r6 = r6 * r3
r7 = r0 * r4
r6 = r6 r5
r6 = r6 r7
*r8 = r6
if (r0 > -100) goto aft
然后,讓它變得更簡單。
r7 = r0 * r4
r6 = r0 * r0 * r3 r5 r7
*r8 = r6
if (r0 > -100) goto aft
通過將相同的程序應用于代碼的其他部分,您將獲得一些可讀的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/488489.html
