程序在ARMv6上的STRB指令上崩溃

时间:2014-05-21 18:26:25

标签: string assembly arm

在学习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上崩溃。

1 个答案:

答案 0 :(得分:3)

编辑:你的循环减少了,而不是增加r0。因此,不是滚动字符串,而是直接向上滚动到代码中,用较少的字节值覆盖指令。一旦覆盖了strb指令,就会发生SIGILL。

替换

sub     r0, #1

add     r0, #1

上一条:我看到r0被初始化为代码部分的一个内存位置,通过pc。那是一个可写的内存块吗?我不太确定。

将字符串放在数据部分中。


编辑:还有另外一件事;你的循环没有退出条件。 SUB除非被告知,否则不会设置标志;所以替换

sub     r4, r4, #1

subs     r4, r4, #1