KDBG 版本:3.0.1。
我在 C 中定義了一個 10x10 矩陣,例如:char myArray[10][10] = { ' ', 'x', ... },用于 ASM。
在 ASM 中,我使用以下行來比較兩個字符的值:
cmp BYTE[myArray rax], 'x'
inc rax
rax,初始化為 0 被用作回圈計數器和相對地址位移,都達到了 100 的數字(因為記憶體中的陣列是 10*10=100 位元組長,對吧?)
所以想法是當 rax 增加 1(位元組)時,在 cmp 指令中我正在訪問 myArray 中的下一個元素。
現在,在 KDBG Watched 運算式面板中,使用時(&myArray $rax)我希望看到我正在訪問的元素的值,但我無法做到這一點。
試過:
- 獨立于 rax 值:
&myArray, 顯示起始地址:(char)(*)[10][10] 0x5050a0 <myArray>, 和一些值以逗號分隔。不能說是不是全部。
- 當 rax=5 時,例如:
(&myArray $rax), address: (char)(*)[10][10] 0x505294 <anotherArray 52>,與起始地址有 500 的差異,它參考了我在 C 中宣告的另一個陣列。
我不確定這個問題是否與 KDBG 語法相關,或者我對 asm 中的陣列如何作業的理解是錯誤的。任何幫助表示贊賞。
uj5u.com熱心網友回復:
當在 C 中宣告一個陣列時,陣列的名稱是指整個陣列的地址,與它的第一個元素的地址相同。
在您的示例中char myArray[10][10],名稱myArray是 element 的地址myArray[0],即 aka &myArray[0]。如果允許,該構造&myArray將具有與 相同的值myArray,但其型別會改變:
myArray有型別char (*)[10],所以元素大小是 10&myArray有型別char (*)[10][10],所以元素大小是 100
在 C 中,指標演算法自動按元素大小縮放整數索引,因此myArray $rax,這意味著縮放應該myArray $rax*10使用顯式縮放。雖然會按 100&myArray $rax縮放。$rax
為了中和縮放,將指標轉換為位元組指標——位元組指標的元素大小為 1,因此有效地抑制了隱式縮放(因為 1 是乘法恒等式)。
強制(char *) myArray轉換將指標轉換為位元組指標,然后您可以有效地進行位元組指標運算而無需 C 的縮放。
并且取消參考 with$rax將產生一個位元組元素,所以((char*)myArray)[$rax].
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457488.html
上一篇:GDB中ASM標簽的地址
下一篇:在32位匯編中撰寫和鏈接共享庫
