assembly - ARM assembly 中的 movw 和 movt

标签 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]

最佳答案

movw随后是 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)

关于assembly - ARM assembly 中的 movw 和 movt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800055/

相关文章:

json - 我在使用arm模板部署存储帐户时遇到问题

linux - objdump -S 不显示 Linux 内核模块的源代码列表

assembly - 将常量 float 加载到 SSE 寄存器中

c - 如何初始化 GNU C 全局寄存器变量

assembly - 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法有什么区别?

MIPS反汇编: lui followed by lbu

c - 文件的机器代码(可执行)?

assembly - 为什么条件移动不能正常工作

objective-c - iPhone/iPad double 学

linux - 在嵌入式设计中,使用 linux 操作系统与直接针对 cpu 编程的实际开销是多少?