在不知道组装程序应该做什么的情况下解释它的最佳做法是什么?



我正在学习通过汇编考试,我们应该在没有注释或任何东西的情况下解释汇编源文件,这是我发现特别困难的任务。我的问题是,在这些情况下,我认为在专业环境中经常发生,是否有线索可以寻找,以确定程序的流程和目的是什么。我能够通过分支和跳转指令识别循环,但除此之外就没有别的了,而且我似乎在网上找不到任何合适的源代码。我将在这里发布一个示例程序供参考,这是我目前遇到的困难,以防有人想指出一些事情。

.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

通过对代码的其他部分应用相同的过程,您将获得一些可读的代码。

相关内容

最新更新