在手臂组件中移动和移动

use*_*039 9 assembly arm disassembly

我无法破译这个汇编代码块.r1的价值到底是什么?我将如何到达那里?

3242ba66    f6454118    movw    r1, 0x5c18
3242ba6a        466f    mov     r7, sp
3242ba6c    f6c0415a    movt    r1, 0xc5a
3242ba70    f2460002    movw    r0, 0x6002
3242ba74    f6c0405a    movt    r0, 0xc5a
3242ba78        4479    add     r1, pc
3242ba7a        4478    add     r0, pc
3242ba7c        6809    ldr     r1, [r1, #0]
Run Code Online (Sandbox Code Playgroud)

Var*_*der 32

movw后跟a movt是将32位值加载到寄存器的常用方法.它相当于将这两个立即值组合在一起,movt即高16位.在这种情况下,r1 = (movt immediate value << 16) | (movw immediate value)).

3242ba66    f6454118    movw    r1, 0x5c18   // r1 = 0x5c18
3242ba6a        466f    mov     r7, sp
3242ba6c    f6c0415a    movt    r1, 0xc5a    // r1 = (r1 & 0xffff) | (0xc5a << 16)
3242ba70    f2460002    movw    r0, 0x6002
3242ba74    f6c0405a    movt    r0, 0xc5a
3242ba78        4479    add     r1, pc       // r1 = r1 + pc
3242ba7a        4478    add     r0, pc
3242ba7c        6809    ldr     r1, [r1, #0] // r1 = *(r1 + 0)
Run Code Online (Sandbox Code Playgroud)

  • 您遇到困难的部分解释是什么? (3认同)
  • 我认为回答这个问题需要很长时间.见http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0473c/Cacdbfji.html (2认同)