배열에서 ARM 어셈블리에서 배열이 작동하는 방식을 알아 내려했지만, 난 그냥 압도당했습니다. 크기 20, 0, 1, 2 등의 배열을 초기화하고 싶습니다.ARM 어셈블리 배열
A[0] = 0
A[1] = 1
내가 올바르게 작성한 것을 인쇄하는 방법을 알지 못합니다. 이것은 내가 지금까지 가지고있는 것입니다 :
.data
.balign 4 @ Memory location divisible by 4
string: .asciz "a[%d] = %d\n"
a: .skip 80 @ allocates 20
.text
.global main
.extern printf
main:
push {ip, lr} @ return address + dummy register
ldr r1, =a @ set r1 to index point of array
mov r2, #0 @ index r2 = 0
loop:
cmp r2, #20 @ 20 elements?
beq end @ Leave loop if 20 elements
add r3, r1, r2, LSL #2 @ r3 = r1 + (r2*4)
str r2, [r3] @ r3 = r2
add r2, r2, #1 @ r2 = r2 + 1
b loop @ branch to next loop iteration
print:
push {lr} @ store return address
ldr r0, =string @ format
bl printf @ c printf
pop {pc} @ return address
ARM은 충분히 혼란스럽고, 나는 잘못하고 있습니다. 아무도 내가 어떻게 더 잘 이해할 수있는 작품인지 이해할 수 있다면 도움이 될 것입니다.
디버거를 사용하면 제대로 수행하는지 확인할 수 있습니다. 귀하의 배열 처리가 잘 보이지만 인쇄 부분이 잘못되었습니다. 플랫폼에서 printf를 사용하는 방법을 확인하십시오. –
'str r2, [r3] @ r3 = r2' 코멘트가 잘못되었으므로 'r3'이 변경되지는 않지만 메모리 내용이 변경됩니다. 'r3' 값이 가리키는 주소. 또한'mov r2, # 0 @ index r2 = 0'은 약간의 ... 당신은'r2'를 인덱스와 값으로 사용하고 있습니다. 실제로는 좋지만 코멘트에서 단어 "인덱스"를 생략 할 것입니다. 'ldr r1, = a @ 배열의 인덱스 포인트에 r1 설정'r1'은 인덱스가 아닌 (첫 번째 요소의) 배열 주소입니다. (나머지는 사미가 위에서 쓴 것처럼 배열 코드는 괜찮아 보이고 printf는 완전히 borked되며 디버거를 사용하여 메모리 내용을 확인하고 내용을 등록) – Ped7g
단어 배열 또는 바이트 배열을 만들고 싶습니까? 당신은 단어의 배열을 만들었고 그것이 당신이 원한 것이라면 괜찮습니다. –