STRB 工作,除非目标地址被转移
STRB works, unless target address gets shifted
我正在尝试使用 ARM 程序集将一个字符串插入另一个字符串,但是我的代码总是 return 向调用汇编程序的 C 程序发送一个空字符串。我相信我已经将我的问题缩小到 STRB 指令。下面是我的代码,删除了最不相关的代码。要查看的重要部分在 "test" 块中。
.global ins
ins:
stmfd sp!, {v1-v6, lr}
mov v1, a1 @ save pointer to 1st string
mov v2, a2 @ save pointer to 2nd string
bl strlen @ find out length
mov v3, a1 @ save string1 length
mov a1, v2 @ recover pointer to string 2
bl strlen @ length of string 2
add a1, a1, v3 @ total length
add a1, a1, #1 @ add one for null byte
bl malloc
add a3, a3, #1
test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
exit:
.end
v1 和 v2 保存字符串 1 和 2。当我将测试块写为:
test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
然后程序 return 是一个空字符串。但是,如果我把它写成:
test:
ldrb v3, [v1], #1
strb v3, [a1]
ldmfd sp!, {v1-v6, pc}
它成功地 returns 字符串 1 中的第一个字符。显然,这不足以构建一个新字符串,因为我没有对 a1 执行偏移。
有谁知道是什么导致字符串被 return 编辑为空?老实说,经过几个小时的试验和研究,我不知道问题出在哪里。
非常感谢任何帮助!
a1
中的值被returned 到调用您的汇编例程的 C 函数。您需要 return 字符串开头的地址,但是如果您在写入字符串时递增 a1
,您将 return 字符串结尾的地址。
如果您使用另一个寄存器来存储您正在写入的当前地址,那么当您 return 时,起始地址仍将在 a1
中。例如:
test:
mov v4, a1 @ copy address of new string to v4
ldrb v3, [v1], #1
strb v3, [v4], #1 @ increment v4, the start of string
@ will still be in a1
ldmfd sp!, {v1-v6, pc}
我正在尝试使用 ARM 程序集将一个字符串插入另一个字符串,但是我的代码总是 return 向调用汇编程序的 C 程序发送一个空字符串。我相信我已经将我的问题缩小到 STRB 指令。下面是我的代码,删除了最不相关的代码。要查看的重要部分在 "test" 块中。
.global ins
ins:
stmfd sp!, {v1-v6, lr}
mov v1, a1 @ save pointer to 1st string
mov v2, a2 @ save pointer to 2nd string
bl strlen @ find out length
mov v3, a1 @ save string1 length
mov a1, v2 @ recover pointer to string 2
bl strlen @ length of string 2
add a1, a1, v3 @ total length
add a1, a1, #1 @ add one for null byte
bl malloc
add a3, a3, #1
test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
exit:
.end
v1 和 v2 保存字符串 1 和 2。当我将测试块写为:
test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
然后程序 return 是一个空字符串。但是,如果我把它写成:
test:
ldrb v3, [v1], #1
strb v3, [a1]
ldmfd sp!, {v1-v6, pc}
它成功地 returns 字符串 1 中的第一个字符。显然,这不足以构建一个新字符串,因为我没有对 a1 执行偏移。
有谁知道是什么导致字符串被 return 编辑为空?老实说,经过几个小时的试验和研究,我不知道问题出在哪里。
非常感谢任何帮助!
a1
中的值被returned 到调用您的汇编例程的 C 函数。您需要 return 字符串开头的地址,但是如果您在写入字符串时递增 a1
,您将 return 字符串结尾的地址。
如果您使用另一个寄存器来存储您正在写入的当前地址,那么当您 return 时,起始地址仍将在 a1
中。例如:
test:
mov v4, a1 @ copy address of new string to v4
ldrb v3, [v1], #1
strb v3, [v4], #1 @ increment v4, the start of string
@ will still be in a1
ldmfd sp!, {v1-v6, pc}