1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
/* Copyright 2010, 2011 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
.syntax unified
.text
.type main,%function
#if defined (__thumb__) || defined (__thumb2__)
.code 16
.thumb_func
#endif
.globl main
main:
push {r7, lr}
add sp, sp, #4
mov r7, sp
/* Test call and return */
.global test_call
test_call:
bl test_call_subr
.global test_ret_end
test_ret_end:
nop @ Location test_ret_end
/* Test branch */
bl test_branch
/* Test ldr from pc */
bl test_ldr_pc
/* Test ldm/stm only in ARM mode */
#if !defined (__thumb__) && !defined (__thumb2__)
bl test_ldm_stm_pc
#endif
/* Test str in ARM mode and Thumb-2 */
#if !defined(__thumb__)
bl test_str_pc
#endif
/* Return */
mov sp, r7
sub sp, sp, #4
movs r0, #0
pop {r7, pc}
.size main, .-main
.global test_call_subr
#if defined (__thumb__) || defined (__thumb2__)
.code 16
.thumb_func
#endif
.type test_call_subr, %function
test_call_subr:
nop
.global test_call_end
test_call_end:
nop @ Location test_call_end
.global test_ret
test_ret:
bx lr
.size test_call_subr, .-test_call_subr
.global test_branch
#if defined (__thumb__) || defined (__thumb2__)
.code 16
.thumb_func
#endif
.type test_branch, %function
test_branch:
b L_branch
.global
L_branch:
bx lr
.size test_branch, .-test_branch
.global test_ldr_pc
#if defined (__thumb__) || defined (__thumb2__)
.code 16
.thumb_func
#endif
.type test_ldr_pc, %function
test_ldr_pc:
ldr r1, [pc, #0]
.global
test_ldr_pc_ret:
bx lr
.size test_ldr_pc, .-test_ldr_pc
#if !defined (__thumb__) && !defined (__thumb2__)
.global test_ldm_stm_pc
.type test_ldm_stm_pc, %function
test_ldm_stm_pc:
stmdb sp!, {lr, pc}
ldmia sp!, {r0, r1}
ldr r0, .L1
stmdb sp!, {r0}
.global
test_ldm_pc:
ldmia sp!, {pc}
.global
test_ldm_stm_pc_ret:
bx lr
.align 2
.L1:
.word test_ldm_stm_pc_ret
.size test_ldm_stm_pc, .-test_ldm_stm_pc
#endif
#if !defined(__thumb__)
#if defined (__thumb2__)
.code 16
.thumb_func
#endif
.global test_str_pc
.type test_str_pc, %function
test_str_pc:
str pc, [sp, #-4]
ldr r0, [sp, #-4]
sub r0, r0, pc
/* compute offset again without displaced stepping. */
str pc, [sp, #-4]
ldr r1, [sp, #-4]
sub r1, r1, pc
/* r0 should be equal to r1. */
cmp r0, r1
bne pc_offset_wrong
.global pc_offset_right
pc_offset_right:
b test_str_pc_end
.global pc_offset_wrong
pc_offset_wrong:
nop
.global test_str_pc_end
test_str_pc_end:
bx lr
#endif
|