00. 目录


文章目录


  • 00. 目录
  • 01. ldr伪指令
  • 02. ldr指令
  • 03. adr指令
  • 04. str指令
  • 05. 附录


01. ldr伪指令

ldr示例一:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"

.section .text
.align 2
.global main
main:
push {lr}

ldr r0, =.LC0
@r0 = *(.L0)
ldr r1, .L0
bl printf

mov r0, #0
pop {pc}

.L0:
.word 0x11112222

执行结果

[root@itcast 3rd]# ./a.out  
val = 0x11112222
[root@itcast 3rd]#

ldr示例二:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"


.section .text
.align 2
.global main
main:
push {lr}

ldr r0, =.LC0
ldr r1, .L0
bl printf

ldr r0, =.LC0
ldr r1, .L0 + 4
bl printf

ldr r0, =.LC0
ldr r1, .L0 + 8
bl printf

mov r0, #0
pop {pc}


.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

执行结果:

[root@itcast 3rd]# ./a.out  
val = 0x1111
val = 0x2222
val = 0x3333
[root@itcast 3rd]#

02. ldr指令

程序示例一:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
1:
ldr r0, =.LC0
@r1 = *(r4)
ldr r1, [r4]

cmp r1, #0
beq 1f

bl printf

add r4, #4
b 1b

1:
mov r0, #0
pop {pc}

.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

程序示例二:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
1:
ldr r0, =.LC0
@r1 = *(r4); r4 = r4 + 4;
ldr r1, [r4], #4

cmp r1, #0
beq 1f

bl printf

b 1b

1:

mov r0, #0
pop {pc}


.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

程序示例三:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
mov r5, #0
1:
ldr r0, =.LC0
ldr r1, [r4, r5]

cmp r1, #0
beq 1f

bl printf

add r5, r5, #4
b 1b

1:
mov r0, #0
pop {pc}

.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

程序示例四:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
mov r5, #0
1:
ldr r0, =.LC0
@ r1 = *(r4 + r5 << 2)
ldr r1, [r4, r5, LSL #2]

cmp r1, #0
beq 1f

bl printf

add r5, r5, #1
b 1b

1:

mov r0, #0
pop {pc}


.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

程序示例五:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"

.LC1:
.string "ar[%d] = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
mov r5, #0
1:
ldr r0, =.LC1
ldr r2, [r4, r5, LSL #2]

cmp r2, #0
beq 1f

mov r1, r5
bl printf

add r5, r5, #1
b 1b

1:

mov r0, #0
pop {pc}


.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x5555
.word 0x6666
.word 0x0

程序示例六:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"

.LC1:
.string "ar[%d] = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
mov r5, #0
1:
ldr r0, =.LC1
ldrh r2, [r4], #2

cmp r2, #0
beq 1f

mov r1, r5
bl printf

add r5, r5, #1
b 1b

1:

mov r0, #0
pop {pc}


.L0:
.word 0x11111111
.word 0x22222222
.word 0x33333333
.word 0x44444444
.word 0x55555555
.word 0x66666666
.word 0x0

执行结果

[root@itcast 3rd]# ./a.out  
ar[0] = 0x1111
ar[1] = 0x1111
ar[2] = 0x2222
ar[3] = 0x2222
ar[4] = 0x3333
ar[5] = 0x3333
ar[6] = 0x4444
ar[7] = 0x4444
ar[8] = 0x5555
ar[9] = 0x5555
ar[10] = 0x6666
ar[11] = 0x6666
[root@itcast 3rd]#

程序示例七:

.section .rodata
.align 2
.LC0:
.string "val = %p\n"

.LC1:
.string "ar[%d] = %p\n"


.section .text
.align 2
.global main
main:
push {lr}


ldr r4, =.L0
mov r5, #0
1:
ldr r0, =.LC1
ldrb r2, [r4], #1

cmp r2, #0
beq 1f

mov r1, r5
bl printf

add r5, r5, #1
b 1b

1:
mov r0, #0
pop {pc}

.L0:
.word 0x11111111
.word 0x22222222
.word 0x33333333
.word 0x44444444
.word 0x55555555
.word 0x66666666
.word 0x0

程序示例八:

.section  .rodata
.align 2
.LC0:
.string "val = %p \n"

.text
.align 2
.global main
main:
push {lr}

ldr r0, =.LC0
ldr r2, =.L1
ldr r1, [r2, #-4095]
bl printf

mov r0, #0
pop {pc}
.L0:
.word 0x11111111
.word 0x22222222
.L1:
.word 0x33333333
.word 0x44444444
.word 0x0

程序示例九:

.section .rodata
.align 2
.LC0:
.string "hello world\n"

.section .text
.align 2
.global main
main:
push {lr}

@ldr r0, .L0
@ldr r0, =.LC0
ldr r0, [pc, #8]
bl printf

mov r0, #0
pop {pc}


.L0:
.word .LC0

03. adr指令

程序示例

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"

.section .text
.align 2
.global main
main:
push {lr}

ldr r0, =.LC1
adr r2, .L0
ldr r1, [r2]
bl printf

mov r0, #0
pop {pc}


.L0:
.word 0x11223344

04. str指令

程序示例一:

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"

.section .text
.align 2
.global main
main:
push {lr}

ldr r4, =.L0
1:
ldr r0, =.LC1
ldr r1, [r4], #4
cmp r1, #0
beq 1f

bl printf

b 1b

1:

ldr r4, =.L0
mov r1, #1
1:
str r1, [r4], #4
add r1, #1
cmp r1, #4
ble 1b

ldr r4, =.L0
1:
ldr r0, =.LC1
ldr r1, [r4], #4
cmp r1, #0
beq 1f

bl printf
b 1b

1:
mov r0, #0
pop {pc}

.section .data
.align 2
.global .L0
.L0:
.word 0x1111
.word 0x2222
.word 0x3333
.word 0x4444
.word 0x0

程序示例二:

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"
.LC2:
.string "ar[%d] = %d\n"

.section .text
.align 2
.global main
main:
push {lr}

sub sp, sp, #16

mov r1, #0
1:
str r1, [sp], #4
add r1, #1
cmp r1, #4
bne 1b


mov r4, #0
mov r5, #-4
1:
mov r1, r4
ldr r2, [sp, r5]
ldr r0, =.LC2
bl printf

add r4, #1
sub r5, #4
cmp r4, #4
bne 1b

mov r0, #0
pop {pc}

程序示例三:

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"
.LC2:
.string "ar[%d] = %d\n"

.section .text
.align 2
.global main
main:
push {lr}

sub sp, sp, #16
mov r4, sp

mov r1, #0
1:
str r1, [r4], #4
add r1, #1
cmp r1, #4
bne 1b


mov r4, #0
1:
mov r1, r4
ldr r2, [sp, r4, LSL #2]
ldr r0, =.LC2
bl printf

add r4, #1
cmp r4, #4
bne 1b

add sp, sp, #16
mov r0, #0
pop {pc}

程序示例四:

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"
.LC2:
.string "ar[%d] = %d\n"

.section .text
.align 2
.global main
main:
push {lr}

sub sp, sp, #16
mov r4, sp

mov r1, #0
1:
str r1, [r4], #4
add r1, #1
cmp r1, #4
bne 1b


mov r5, sp
mov r4, #0
1:
mov r1, r4
ldr r2, [sp, r4, LSL #2]
ldr r0, =.LC2
bl printf

add r4, #1
cmp r4, #4
bne 1b

add sp, sp, #16
mov r0, #0
pop {pc}

程序示例五:

.section .rodata
.align 2
.LC0:
.string "hello world\n"
.LC1:
.string "val = %p\n"
.LC2:
.string "ar[%d] = %d\n"

.section .text
.align 2
.global main
main:
push {lr}

sub sp, sp, #12
mov r4, sp

mov r1, #0
1:
strb r1, [r4], #1
add r1, #1
cmp r1, #12
bne 1b


mov r5, sp
mov r4, #0
1:
mov r1, r4
ldrb r2, [r5, r4]
ldr r0, =.LC2
bl printf

add r4, #1
cmp r4, #12
bne 1b

add sp, sp, #12
mov r0, #0
pop {pc}

05. 附录

8.1 【ARM】Load Store指令