主题:ARM 汇编语言 一个很奇怪的问题
我刚开始学习arm汇编语言,写了一个程序,发现一个很奇怪的错误,请大家告诉我是为什么这么写是错的。
程序功能:读取用户输入的2个数,比较其大小,并计算它们的差与和。
.global main
main:
mov ip,sp
stmfd sp!,{fp,ip,lr,pc}
sub fp,ip,#4
adr r0,.N1
bl printf
adr r0,.LC1
ldr r1,in
bl scanf
adr r0,.N2
bl printf
adr r0,.LC1
ldr r1,in
add r1,r1,#4
bl scanf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
add r1,r1,r2
adr r0,.LC2
bl printf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
sub r1,r1,r2
adr r0,.LC3
bl printf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
cmp r2,r1
beq o3
blt o2
ldr r1,[r3,#4]
adr r0,.LC4
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
o2:
adr r0,.LC4
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
o3: adr r0,.LC5
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
.N1: .asciz "key in the first number"
.N2: .asciz "\n key in the second number"
.LC1: .ascii "%d\000"
.LC2: .asciz "sum= %d\n"
.LC3: .asciz "difference = %d\n"
.LC4: .asciz "greater = %d"
.LC5: .asciz " they have the same value " /*问题就在这里*/
in: .word inarea
.bss
.align 2
inarea: .space 4
原本.LC5我写的是"same vlaue",出现的错误是:
# ./example
key in the first number 5
pc : [<4006c728>] lr : [<bffffe20>] Not tainted
sp : bffff8e8 ip : 00000000 fp : bffffe0c
r10: 4012cce0 r9 : 00000000 r8 : 0000000a
r7 : 4012b01c r6 : 000084b1 r5 : 00000064 r4 : 00000000
r3 : 00206558 r2 : 00000005 r1 : 00000000 r0 : 00000005
Flags: nZCv IRQs on FIQs on Mode USER_32 Segment user
Control: 397F Table: A0D58000 DAC: 00000015
Segmentation fault
无意间修改,将LC5的内容加长后,变为“ they have the same value ”之后,就能正确执行了。--特别的是,“和字母t之间、字母e和”之间,必须有空格,(我试过“ same value ”和“they have the same value”,都是错误的)
恳请知道原因的人告诉我这是为什么!谢谢
程序功能:读取用户输入的2个数,比较其大小,并计算它们的差与和。
.global main
main:
mov ip,sp
stmfd sp!,{fp,ip,lr,pc}
sub fp,ip,#4
adr r0,.N1
bl printf
adr r0,.LC1
ldr r1,in
bl scanf
adr r0,.N2
bl printf
adr r0,.LC1
ldr r1,in
add r1,r1,#4
bl scanf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
add r1,r1,r2
adr r0,.LC2
bl printf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
sub r1,r1,r2
adr r0,.LC3
bl printf
ldr r3,in
ldr r1,[r3]
ldr r2,[r3,#4]
cmp r2,r1
beq o3
blt o2
ldr r1,[r3,#4]
adr r0,.LC4
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
o2:
adr r0,.LC4
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
o3: adr r0,.LC5
bl printf
mov r0,#0
ldmea fp,{fp,sp,pc}
.N1: .asciz "key in the first number"
.N2: .asciz "\n key in the second number"
.LC1: .ascii "%d\000"
.LC2: .asciz "sum= %d\n"
.LC3: .asciz "difference = %d\n"
.LC4: .asciz "greater = %d"
.LC5: .asciz " they have the same value " /*问题就在这里*/
in: .word inarea
.bss
.align 2
inarea: .space 4
原本.LC5我写的是"same vlaue",出现的错误是:
# ./example
key in the first number 5
pc : [<4006c728>] lr : [<bffffe20>] Not tainted
sp : bffff8e8 ip : 00000000 fp : bffffe0c
r10: 4012cce0 r9 : 00000000 r8 : 0000000a
r7 : 4012b01c r6 : 000084b1 r5 : 00000064 r4 : 00000000
r3 : 00206558 r2 : 00000005 r1 : 00000000 r0 : 00000005
Flags: nZCv IRQs on FIQs on Mode USER_32 Segment user
Control: 397F Table: A0D58000 DAC: 00000015
Segmentation fault
无意间修改,将LC5的内容加长后,变为“ they have the same value ”之后,就能正确执行了。--特别的是,“和字母t之间、字母e和”之间,必须有空格,(我试过“ same value ”和“they have the same value”,都是错误的)
恳请知道原因的人告诉我这是为什么!谢谢