4

アーム アセンブリを使用して、1 つの 32 ビット 16 進数をレジスタに直接ロードしたいと考えています。

mov r1,#0x6c617669

この命令からロードできるのは 8 ビット値のみであるため、これは使用できません。そのため、メモリから直接 32 ビット値をロードしました。では、32 ビット値をメモリに格納し、アーム アセンブリを使用してレジスタに直接ロードするにはどうすればよいでしょうか?

このコードを試しました。

    .global main
main:
    sub sp,sp,#4
    str lr,[sp,#0]

    sub sp,sp,#4
    str r0,x
    add sp,sp,#4

    ldr lr,[sp,#0]
    add sp,sp,#4
    mov pc,lr

    .data
x: .word 0x6c617669

しかし、次のエラーが発生します。

test1.s: Assembler messages: 
test1.s:45: Error: internal_relocation (type: OFFSET_IMM) not fixed up
4

3 に答える 3

8

2 つの基本的な選択肢があります。一度に8つの非ゼロビットをロードするか、レジスタを構築できます

mov r0,#0x12000000             @ construct from 8-bit rotated immediates
orr r0,r0,#0x00340000
orr r0,r0,#0x00005600
orr r0,r0,#0x00000078
...

ldr r1,=0x12345678             @ let the assembler figure out how
...

ldr r3,myconst                 @ explicitly load from a nearby constant
...
myconst: .word 0x12345678

後者の 2 つは同じです。equals トリックは、アセンブラに、値を手の届く範囲に配置し、pc 相対ロードを実行するように要求するだけです。

于 2016-08-01T01:38:11.770 に答える
2

プロセッサによっては、別の命令セット (movw と movt) を使用できる場合があります。たとえば、以下の手順は GCC を使用する Raspberry Pi 2 では機能しません。ただし、Marvell Armada 370/XP では動作します。私の記憶が正しければ、これは Cortex-A9 です。

movw r1, #0x6c61
movt r1, #0x7669

...

r1 0x6c617669 1818326633
于 2017-01-04T17:46:23.623 に答える
0

直接ではなく、間接的に別の方法で行うことができます。

.data

.balign 4
value: .word 0x6c617669

.text

.global main
main:
    push {lr}                        /* save lr value on stack */

    ldr r0, address_of_value         /* r0 = &value */
    ldr r0, [r0]                     /* r0 = *r0 = value */

    pop {lr}                         /* load lr (R14) register from stack */
    bx lr                            /* return from main using lr */

address_of_value: .word value

R0 レジスタには、このコードのデバッグを見ることができるように、32 ビットの値が含まれています。

(gdb) start
Temporary breakpoint 1 at 0x103ec
Starting program: /home/pi/asm/kk

Temporary breakpoint 1, 0x000103ec in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
=> 0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
   0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x1      1
(gdb) stepi
0x000103f0 in main ()
(gdb) stepi
0x000103f4 in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
   0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
=> 0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x6c617669       1818326633

よろしく。

于 2017-01-04T10:21:04.153 に答える