在学习ARMv6 ASM(使用raspberry pi)时,我试图实现一个可以修改字符串内容的循环,但是我似乎无法将修改后的字节存储回内存。 使用GDB并在各个点断开显示我所有的注册表值都完美地工作,直到它涉及到STRB指令。然后它因某些未知原因而崩溃。 循环应该以相反的顺序将所有字节减1。
.text
.global _start
_start:
/* Thumb mode */
.code 32
add r6, pc, #1
bx r6
.code 16
mov r4, #6
mov r0, pc
add r0, #16
loop:
/*load, modify, store*/
ldrb r3, [r0]
sub r3, #1
strb r3, [r0] /*THIS IS BROKEN*/
sub r0, #1
sub r4, r4, #1
bne loop
bx lr
.data
string:
asciz "HiThere"
STRB指令似乎使程序崩溃,我正在使用一本旧书来学习,我是否遗漏了一些明显的东西?
编辑:是的我知道这不是加载r0的最好方法,但它有效......我想它将来可能会使用标签。 编辑2:对不起,我知道我的问题写得不好,为了清晰起见,我添加了更多代码。在gdb中单步执行时仍然在STRB上崩溃。
答案 0 :(得分:3)
编辑:你的循环减少了,而不是增加r0。因此,不是滚动字符串,而是直接向上滚动到代码中,用较少的字节值覆盖指令。一旦覆盖了strb指令,就会发生SIGILL。
替换
sub r0, #1
与
add r0, #1
上一条:我看到r0被初始化为代码部分的一个内存位置,通过pc。那是一个可写的内存块吗?我不太确定。
将字符串放在数据部分中。
sub r4, r4, #1
与
subs r4, r4, #1