【问题标题】:Machine code finding in arm assembly(branch)手臂组件中的机器代码查找(分支)
【发布时间】:2020-06-08 20:09:39
【问题描述】:

大家好,我正在尝试将下面的代码转换为机器代码,但我卡住了..“分支指令的偏移量由汇编器计算: – 通过将分支指令和目标地址之间的差减去 8(允许管道)。”在一些幻灯片中找到了这些信息。根据这些信息,我假设 1. 线路的地址是 ...4000,BNE 循环的地址在 400c 中。所以 4000-400c=-c 和 -c-8=-14 .所以我认为机器码值应该是0001 101 0 111111111111111111101100。最后一部分是偏移量,它的-14是2的cmplemen。我不确定是真的吗?但也有一些资源说偏移值应该是-5所以我不能确定。 this is the empty set

loop LDR R2,[R1],#4 ; Loading value from array and ;updating(increment) the address
ADD R3,R3,R2 ; Sum is stored in R3 register
SUB R0,R0,#1 ; Decrementing counter value
CMP R0,#00 ; Checking counter value
BNE loop

【问题讨论】:

  • 如果loop 位于4000,则BNE 不能位于400c。它位于4010。偏移量是字而不是字节,因此是 -6 个字。编码为1A FF FF FA。您可以自己使用汇编程序进行检查。
  • 对不起,我是新手。我不明白它是-6。
  • 4 条指令跳转回来(CMP + SUB + ADD + LDR),加上 2 条用于管道(8 个字节为 2 个字/指令)。或者,如果您想使用地址进行计数,那么 0x4000 - 0x4010 - 8 = -24 bytes = -6 words
  • 哦,知道了。谢谢

标签: assembly arm


【解决方案1】:
00002000 <loop>:
    2000:   e4912004    ldr r2, [r1], #4
    2004:   e0833002    add r3, r3, r2
    2008:   e2400001    sub r0, r0, #1
    200c:   e3500000    cmp r0, #0
    2010:   1afffffa    bne 2000 <loop>

组装和链接。

1afffffa 条件 0b0001, 0b1010 操作码,分支(非链接)签名立即 24

0xFFFFFA

<target_address>
Specifies the address to branch to. The branch target address is calculated by:
1. Sign-extending the 24-bit signed (two’s complement) immediate to 32 bits.
2. Shifting the result left two bits.
3. Adding this to the contents of the PC, which contains the address of the branch
instruction plus 8.

所以:

0xFFFFFFFA<<2 = 0xFFFFFFE8
0xFFFFFFE8+0x2010+8 = 0x2000

对象拆解:

0xFFFFFFE8+0+8 = 0x0

要创建指令 0x2000 - (0x2010+8) = 0xFFFFFFE8, 0xFFFFFFE8>>2 = 0xFFFFFFFA,修整为 24 位 0x00FFFFFA。添加条件和 opcopde 0x1AFFFFFA。

对于这类东西,获取原始 ARM ARM,您可以从 ARM 中找到最接近的版本,无需在谷歌上搜索非法副本,即获取 ARMv5 ARM ARM,其中包括易于理解的描述,如上述。有时 ARMv7-AR 更好,但很多时候原始 ARM ARM 的直接后代是最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多