gpt4 book ai didi

assembly - ARM反汇编程序输出: When there are two arguments instead of three

转载 作者:行者123 更新时间:2023-12-04 05:03:36 26 4
gpt4 key购买 nike

我正在尝试为考试练习注释反汇编 block 。这是我到目前为止所做的:

00000190 <mystery>:
190: 2300 movs r3, #0 // move address 190 (offset 0) into r3 ?
192: e004 b.n 19e <mystery+0xe> // if 19e then branch to mystery
194: f010 0f01 tst.w r0, #1 ; 0x1 // update flags to 1 in status register
198: bf18 it ne // if 198 not equal to ??? then ???
19a: 3301 addne r3, #1 // add to r3 if not equal to 19a offset 1?
19c: 1040 asrs r0, r0, #1 // shift r0 right one spot (leave it in r0)
19e: 2800 cmp r0, #0 // compare contents of r0 against 0 ?
1a0: d1f8 bne.n 194 <mystery+0x4> // branch to 194 if not equal to something at line 194?
1a2: 4618 mov r0, r3 // move r3 wholecloth into r0
1a4: 4770 bx lr // branch(return from the mystery function)
1a6: bf00 nop // No operation

所以我的评论非常简陋,可能有很大的不正确之处,但最重要的是,我真的不明白诸如 190 或 19a 之类的指令是什么意思。只有两个参数而不是三个参数,那么这些参数是如何工作的呢?

举个例子

19a:   3301      addne   r3, #1

到目前为止,我对此的解释是:如果不等于 X,那么将 Y 添加到 r3? X 和 Y 是什么?我应该使用上一行的结果吗?如果是这样,它取代了(标准三中的)哪个论点?

废话!

我愿意接受我不知道自己在做什么并且完全误解了一切。

请发送帮助!

最佳答案

1) TST 指令与ANDS 指令基本相同,只是它不改变第一个操作数。因此,TST r0, #1 根据 (r0 & 1) 的结果设置标志。具体来说,如果结果为零,即未设置 r0 的第 0 位,它将设置 Z(零)标志。

2) IT 代表 "If-Then" .它检查指示的条件,并有条件地执行最多 4 条以下指令。在您的示例中,您只有一条条件指令,反汇编程序提供了 IT 指令中的 NE 后缀(后缀未在 Thumb-2 的指令本身中编码)。 NE 的意思是“不相等”,但在这种情况下没有比较,那么给出了什么?诀窍是相等检查检查 Z 标志,因此您可以将其视为“非零”。因此,我们的 ADD 将在 Z 标志未设置的情况下执行,即 r0 did 设置了位 0。

3) CMP/BNE 周围也会发生类似的情况。 CMP 基本上减去操作数并根据结果设置标志。在我们的例子中,如果 r0 等于 0,它将设置 Z。接下来,BNE 将测试 Z 标志并在未设置时分支(即 r0 等于 0)。

将其全部转换为伪 C,我们得到:

r3 = 0
goto test_loop;
loop:
Z = (r0 & 1) == 0;
if (!Z)
r3 += 1;
r0 = r0 >> 1
test_loop:
Z = (r0 - 0) == 0;
if (!Z) goto loop;
r0 = r3;
return;

或者,在“正常”C中:

r3 = 0;
while ( r0 != 0 )
{
if ( r0 & 1 )
r3++;
r0 >>= 1;
}
return r3;

看起来它正在计算 r0 中的位数。

看看here对于条件代码表以及它们检查的标志。 This描述设置标志的方式和时间。


编辑:我刚刚重读了您的问题,并意识到您的困惑之一。像这样排列:

b.n     19e <mystery+0xe>

一个操作数,而不是两个。反汇编程序试图提供帮助,不仅显示绝对目标地址 (19e),还显示其表示为与最近符号的偏移量(神秘在 190,因此 19e 是神秘+0xe)。

您需要意识到的另一件事是,在 ARM(和许多其他处理器)中,设置标志和使用标志通常在单独的指令中完成。这就是为什么您首先执行 TST 或 CMP(或其他标志设置指令),然后使用条件指令、IT 或条件分支。

关于assembly - ARM反汇编程序输出: When there are two arguments instead of three,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com