Assembly 将其他值存储在内存、ARM组件中后,始终加载零值
我在ARM汇编中制作了两个子程序。假设在向量的第一个可用位置存储字节值。这一个在我的代码中称为“appendbyte”,似乎工作正常。另一个应该打印存储在这个向量中的值,但是它为其中的所有元素打印0,这是不对的 向量结构在向量的第一个地址中存储了元素的数量,并且其中最多必须存储255个值 以下是完整的代码:Assembly 将其他值存储在内存、ARM组件中后,始终加载零值,assembly,arm,Assembly,Arm,我在ARM汇编中制作了两个子程序。假设在向量的第一个可用位置存储字节值。这一个在我的代码中称为“appendbyte”,似乎工作正常。另一个应该打印存储在这个向量中的值,但是它为其中的所有元素打印0,这是不对的 向量结构在向量的第一个地址中存储了元素的数量,并且其中最多必须存储255个值 以下是完整的代码: .text .global main .equ num, 255 @ Max number of elements main: push
.text
.global main
.equ num, 255 @ Max number of elements
main:
push {lr}
mov r8, #7
bl appendbyte
mov r8, #5
bl appendbyte
mov r8, #8
bl appendbyte
bl printvector
pop {pc}
printvector:
push {lr}
ldr r4, =vet @ stores the address of the start of the vector in r4
ldr r5, [r4], #1 @ stores the number of elements in r5
loop:
cmp r5, #0 @if there isn't elements to print
beq fimimprime @quit subroutine
ldr r0, =node @r0 receives the print format
ldr r1, [r4], #1 @stores in r1 the value of the element pointed by r4. Increments r4 after that.
sub r5, r5, #1 @decrements r5 (number of elements left to print)
bl printf @call printf
b loop @continue on the loop
endprint:
pop {pc}
appendbyte:
push {lr}
ldr r4, =vet @stores in r4 the beggining address of the vector
ldr r5, [r4], #1 @stores in r5 the number of elements and makes r4 point to the next address
add r6, r4, r5 @stores in r6 the address of the first available position
str r8, [r6] @put the value at the first available position
ldr r4, =vet @stores in r4 the beggining address of the vector
add r5, r5, #1 @ increment the number of elements in the vector
str r5, [r4] @ stores it in the vector
pop {pc}
.data @ Read/write data follows
.align @ Make sure data is aligned on 32-bit boundaries
vet: .byte 0
.skip num @ Reserve num bytes
.align
node: .asciz "[%d]\n"
.end
我希望我清楚这个问题。
提前谢谢 既然length元素是一个单字节,你不应该在访问向量长度的所有地方都使用
ldrb
和strb
吗?@Michael如果我这样做,我会在“appendbyte”子例程(ldrb r5,[r4],#1)的第3行得到一个seg fault错误,但我唯一不能使用ldrb的地方是当我加载向量的Begging时(如在LDR4中,=vet)。在这种情况下,我使用“ldr”。为什么会这样?因为你没有访问向量;你正在加载它的地址(只有一个字)。好的,我现在知道了。谢谢!