KDBG ASM 查看数组元素地址和相对地址位移的值
KDBG ASM view array element address and value with relative address displacement
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 监视表达式面板中,当使用 (&myArray+$rax)
时,我希望看到我正在访问的元素的值,但我无法做到这一点。
尝试过:
- 独立于 rax 值:
&myArray
,显示起始地址:(char)(*)[10][10] 0x5050a0 <myArray>
,一些值以逗号分隔。分不清是不是全部
- 当rax=5时,例如:
(&myArray+$rax)
,地址:(char)(*)[10][10] 0x505294 <anotherArray+52>
,和起始地址相差500,引用了我在C中声明的另一个数组
我不确定这个问题是否与 KDBG 语法相关,或者我对数组在 asm 中的工作方式的理解有误。任何帮助表示赞赏。
在C语言中声明数组时,数组名指的是整个数组的地址,与第一个元素的地址值相同。
在您的示例 char myArray[10][10]
中,名称 myArray
是元素 myArray[0]
的地址,又名 &myArray[0]
。如果允许,构造 &myArray
将具有与 myArray
相同的值,但其类型将更改:
myArray
具有类型 char (*)[10]
,因此元素大小为 10
&myArray
具有类型 char (*)[10][10]
,因此元素大小为 100
在 C 中,指针运算会自动按元素大小缩放整数索引,因此 myArray+$rax
,这意味着缩放应该 myArray+$rax*10
显式缩放。虽然 &myArray+$rax
会将 $rax
缩放 100。
为了中和缩放,将指针转换为字节指针——字节指针的元素大小为 1,因此隐式缩放有效地被抑制了(因为 1 是乘法恒等式)。
cast (char *) myArray
将指针转换为字节指针,然后您可以在没有 C 缩放的情况下有效地进行字节指针运算。
并且 $rax
的取消引用将产生一个字节元素,因此 ((char*)myArray)[$rax]
.
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 监视表达式面板中,当使用 (&myArray+$rax)
时,我希望看到我正在访问的元素的值,但我无法做到这一点。
尝试过:
- 独立于 rax 值:
&myArray
,显示起始地址:(char)(*)[10][10] 0x5050a0 <myArray>
,一些值以逗号分隔。分不清是不是全部
- 当rax=5时,例如:
(&myArray+$rax)
,地址:(char)(*)[10][10] 0x505294 <anotherArray+52>
,和起始地址相差500,引用了我在C中声明的另一个数组
我不确定这个问题是否与 KDBG 语法相关,或者我对数组在 asm 中的工作方式的理解有误。任何帮助表示赞赏。
在C语言中声明数组时,数组名指的是整个数组的地址,与第一个元素的地址值相同。
在您的示例 char myArray[10][10]
中,名称 myArray
是元素 myArray[0]
的地址,又名 &myArray[0]
。如果允许,构造 &myArray
将具有与 myArray
相同的值,但其类型将更改:
myArray
具有类型char (*)[10]
,因此元素大小为 10&myArray
具有类型char (*)[10][10]
,因此元素大小为 100
在 C 中,指针运算会自动按元素大小缩放整数索引,因此 myArray+$rax
,这意味着缩放应该 myArray+$rax*10
显式缩放。虽然 &myArray+$rax
会将 $rax
缩放 100。
为了中和缩放,将指针转换为字节指针——字节指针的元素大小为 1,因此隐式缩放有效地被抑制了(因为 1 是乘法恒等式)。
cast (char *) myArray
将指针转换为字节指针,然后您可以在没有 C 缩放的情况下有效地进行字节指针运算。
并且 $rax
的取消引用将产生一个字节元素,因此 ((char*)myArray)[$rax]
.