[英]ARMv7 assembly store values in an array
我試圖將用戶輸入的數字添加到數組中的每個元素。 在知道原來的陣列沒有更新之前,我一切正常。 我認為,很簡單,只需將值存儲回數組中,然后繼續進行即可。 可悲的是,這似乎並不那么簡單。
如標題所示,我正在使用ARMv7並編寫匯編。 我一直在使用本指南來了解基礎知識並查看一些好的代碼。 當我運行此處給出的示例代碼時,它工作正常: str r2, [r3]
將r2
放入r3
指向的位置。 以下是我嘗試做的同樣的事情,使我Signal 11 occurred: SIGSEGV (Invalid memory segment access)
, Execution stopped at: 0x0000580C STR r3,[r5,#0]
:
@ Loop and add value to all values in array regardless of array length
@ Setup loop
@ r4 comes from above and the scanf value, I've checked the registers and the value is correct
mov r0, #0
ldr r1, =array_b
ldr r2, addrArr
loop: @ Start loop to add inputed number to every value in array
add r3, r2, r0
ldr r3, [r3]
add r3, r3, r4 @ Add input to each index in array
add r5, r2, r0 @ Pointer to location in array
str r3, [r5] @ Put new value into array
cmp r0, r1 @ Check for end of array
addne r0, r0, #4 @ Not super necessary but it shows one of the cool things ARM can do, condition math
bne loop @ Branch if not equal
beq doneLoop @ Branch if equal
doneLoop: @ End loop
這是vars
.align 2
array:
.word 0
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.equ array_b, .-array
addrArr: .word array
我的理解是, str
首先選擇源,然后再選擇目的地(由於某些原因,它與其他指令不同)。 因此, r5
用於計算數組中存儲值的位置,而r3
具有來自add
指令的值。 我已經檢查過,並且r5
的值是有效的,即:它是數組的開始,而array_b是適當的長度(在這種情況下為32)。 我也嘗試過=array
而不是addrArr
但是它們給出相同的值和相同的段錯誤消息。
這是因為歷史上系統中存在兩種主要的內存:
許多系統不直接使用ROM,而是可以將數據從其他永久性支持(例如軟盤,磁帶或硬盤)加載到RAM中。 為了避免程序寫入不應被寫入的RAM存儲器,可以使用分段存儲器將RAM划分為多個區域。
並非所有系統都具有此功能,因此它實際上取決於體系結構。 如果使用分段內存,則當您嘗試寫入旨在只讀的RAM片段時,它基本上會使處理器退出應用程序。 這正是您在這里遇到的問題。
為了解決這個問題,您應該聲明您的數組,該數組是一個變量,應在.data
到RAM中。
另一方面,您的可執行指令應放在標有匯編指令.text
的只讀段中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.