我正在调试应用程序,需要查看由rcx中存储的值所指向的内存区域。通常,对于代码,这可以通过选择变量(指针)并添加快速监视以及从指针开始监视的元素数量来完成:

c++ - 解引用存储在寄存器中的指针(Visual Studio)-LMLPHP

我想在下面的代码中获得指向在rcx中移动的字符串的指针:

#include <stdio.h>

int main() {
000000013F1217C0  push        rbp
000000013F1217C2  push        rdi
000000013F1217C3  sub         rsp,0E8h
000000013F1217CA  lea         rbp,[rsp+20h]
000000013F1217CF  mov         rdi,rsp
000000013F1217D2  mov         ecx,3Ah
000000013F1217D7  mov         eax,0CCCCCCCCh
000000013F1217DC  rep stos    dword ptr [rdi]
    goto mylabel;
000000013F1217DE  jmp         $mylabel (013F1217EEh)
000000013F1217E0  jmp         $mylabel (013F1217EEh)
    printf("Skipped\n");
000000013F1217E2  lea         rcx,[string "Skipped\n" (013F129C28h)]
000000013F1217E9  call        printf (013F1211CCh)
mylabel:
    printf("goto ftw!\n");
000000013F1217EE  lea         rcx,[string "goto ftw!\n" (013F129C38h)]
000000013F1217F5  call        printf (013F1211CCh)
    return 0xf00d;
000000013F1217FA  mov         eax,0F00Dh
}
000000013F1217FF  lea         rsp,[rbp+0C8h]
000000013F121806  pop         rdi
000000013F121807  pop         rbp
000000013F121808  ret


如何获得rcx指向的值?在汇编中,语法为:

[rcx+index]


但是我怎样才能在Visual Studio中看到其价值呢?

我尝试添加:

[rcx]
[rcx],10
rcx,10


在QuickWatch中,但是对于前两个条目,我得到了:

不允许输入类型名称

最后,我无法取消引用rcx,它如前所示。

编辑:

rcx中的值强制转换为所需的类型即可。在上述情况下,可以在(char*)rcx上添加快速监视,在调试窗口中显示整个字符串。对于其他类型(即整数),还需要在手表中也指定元素数,否则仅显示第一个值。例如,(int*)rcx, 10从存储在rcx中的地址值开始显示10个四个字节的整数。必须针对寄存器中存储的每个数据调整类型。

最佳答案

使用_asm {....}将寄存器的值复制到c / c ++指针,然后照常观看。
在这里您可以找到如何从内联汇编访问c变量:
https://msdn.microsoft.com/en-us/library/fabdxz08.aspx

关于c++ - 解引用存储在寄存器中的指针(Visual Studio),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36246692/

10-12 02:11