我正在学习通过汇编考试,我们应该在没有注释或任何东西的情况下解释汇编源文件,这是我发现特别困难的任务。我的问题是,在这些情况下,我认为在专业环境中经常发生,是否有线索可以寻找,以确定程序的流程和目的是什么。我能够通过分支和跳转指令识别循环,但除此之外就没有别的了,而且我似乎在网上找不到任何合适的源代码。我将在这里发布一个示例程序供参考,这是我目前遇到的困难,以防有人想指出一些事情。
.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
欢迎提出任何建议
您可以将每个汇编指令翻译成某种高级形式,并将它们简化为更简单的形式。看看下面的翻译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
通过对代码的其他部分应用相同的过程,您将获得一些可读的代码。