簡體   English   中英

ARMv7程序集將值存儲在數組中

[英]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(隨機存取存儲器)可以被讀取和寫入。 它用於存儲變量。

許多系統不直接使用ROM,而是可以將數據從其他永久性支持(例如軟盤,磁帶或硬盤)加載到RAM中。 為了避免程序寫入不應被寫入的RAM存儲器,可以使用分段存儲器將RAM划分為多個區域。

並非所有系統都具有此功能,因此它實際上取決於體系結構。 如果使用分段內存,則當您嘗試寫入旨在只讀的RAM片段時,它基本上會使處理器退出應用程序。 這正是您在這里遇到的問題。

為了解決這個問題,您應該聲明您的數組,該數組是一個變量,應在.data到RAM中。

另一方面,您的可執行指令應放在標有匯編指令.text的只讀段中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM