2016-12-05 63 views
0

所以我正在學習程序集,我寫了一個程序來總結我在'data_type'中定義的值。裝配初學者:設置一個變量等於DCD中的值的數量?

大氣壓我有手動設置變量「NUM」等於值的「DATA_TYPE」的數量,以確保環總結它們。

我想知道是否有更好的方法來做到這一點?

或者,如果有聲明變量「民」動態地承擔起「DATA_TYPE」值量的方法嗎?

在此先感謝!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

不確定你的彙編程序,但:1)如果'data_values'沒有對齊會發生什麼?如果它與其他彙編程序的工作方式類似,data_values符號將具有未對齊的地址值,而DCD將定義對齊的數據,因此您的代碼將對錯誤的數據字節進行非對齊訪問。我相信你應該交換這兩個,首先對齊,然後定義符號標籤。 2)'BNE'後會發生什麼?或者你只是在調試器中運行它,不要讓它超出你定義的代碼? – Ped7g

+0

好的,謝謝,現在就換掉它們。使用Keil工具。 我只是在調試器中運行它到BNE,因爲它只是一個學習練習,你有什麼建議如何實現我以上要求的? – ohkneel

回答

1

我想知道是否有這樣做的更好的辦法?

意見基礎......太闊。如何構建數據有多種方法,每種方法都適合不同情況下的用戶。我會嘗試列出所有主要的(我打賭我會忘記一些)。

編譯時間:

  • 你做了什麼
  • 在數據的開始不僅定義標籤,而且在數據的末尾,然後從它們的區別,你可以以字節爲單位計算長度(如果彙編沒有按」 t支持基本表達式,這可能需要運行時計算)。
  • 許多彙編程序都支持基本表達式,而不是定義結束標籤,實際上你可以做一些類似於num equ (($ - start_label)/4)的地方,其中$是某些彙編器(可能不是你的,這是x86 TASM/MASM示例)中的當前地址。
  • 元件和陣列尺寸完全永遠固定的(即「組15串,每5個字符長」 => 75個字​​節正好和代碼寫入僅支持 - 可能不是在現實世界中非常有用,除了一些HW-有限的角落案例......或快速聚焦學習練習,重點關注不同的事物,其中固定數組無關緊要)。

運行:在這種方式

  • 寫代碼的函數調用程序必須支持陣列不僅地址,而且它的大小(非常通用的API風格,你通常可以彎曲的任何其他結構數據要被這樣的API處理,儘管使用值終止的數組可能不是最佳的效率,因爲你必須首先計算大小) - 這將結構問題委託給調用者,並不能自行解決。
  • 使用一些值作爲終結,就像ASCII ž字符串值爲0結束。
  • 使用數據的一些結構,例如C++ std::vector,其中所述內部數據結構不僅包含指針存儲器,還單獨的變量來存儲載體(以及多個其他變量的大小圍繞最後一個分配的分配的內存和大小的容量保持等等。檢查任何std::vector執行得到的想法),在你的情況下,你可能會舉例爲最簡單的DCD 5, 1, 1, 1, 1, 1(第一個字是大小,然後數據跟着)。
  • 其他任何你能想到的..一些現實世界的例子是各種交織結構,例如舊EGA 16彩色圖形模式中的分離位平面,其中一組存儲器每像素存儲一位,並且繪製一個像素,必須切換通過所有四個存儲體,寫入每個特定的位值。你幾乎可以創造任何東西,你可以充分的數學定義和編寫它的代碼。
相關問題