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) 时,我希望看到我正在访问的元素的值,但我无法做到这一点。

尝试过:

  1. 独立于 rax 值:

&myArray,显示起始地址:(char)(*)[10][10] 0x5050a0 <myArray>,一些值以逗号分隔。分不清是不是全部

  1. 当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].