2017-06-13 96 views
-5

我想解碼操作地址,16位ARM Thumb指令的彙編指令。所以,我不認爲我應該關心數據類型。因爲我只對那裏的16位存儲感興趣。我有單獨的解釋器來理解這些位,我不想將它用作數據。瞭解ARM彙編指令和C/C++指針

如果我有一個指針p並且我想讀取4個字節(即從pp+3地址的數據)。將鑄造pint *和取消引用給我的數據?

+1

'p'的類型是什麼? –

+1

'memcpy'到'int32_t'中? –

+3

也請不要同時使用C和C++標籤。雖然有一些語法上的相似之處,但它們都是非常不同的語言。只能將標記用於實際編程的語言。 –

回答

4

您有一個指針某些類型的。指針算術和解引用是對數據類型的尊重。

請注意,您只能通過具有兼容類型或字符指針的左值表達式來訪問任何變量(對象)的存儲值。盲目強制指針轉換爲其他不兼容的類型,並試圖取消引用,這將違反嚴格的別名規則,您將面對undefined behavior

引用C11,章§6.5

一個目的應具有其存儲的值由左值表達具有 之一以下類型的唯一訪問:88)

- 一個類型兼容與對象的有效類型

- 與對象的有效類型兼容的類型的合格版本,

- 一個類型是有符號或對應於有效類型的 對象的無符號類型,

- 一個類型是有符號或對應於 有效類型的對象的一限定的版本無符號類型,

- 聚合或聯合類型包括其 成員之間的上述類型的一個(包括遞歸地,一個子聚集或含有聯合的成員),或

- 字符類型。

但是,您可以隨時使用char *指向任何類型和間接引用和增量(和重複)獲得的字節的各個值,但你需要照顧ENDIANNESS自己。

相關,引用C11,章§6.3.2.3

[....當一個指向對象轉換爲一個指向字符類型, 結果點到最低尋址對象的字節。 結果的連續增量,直到對象的大小,產生指向對象剩餘字節的指針。