这是我的DISAS代码:

   0x0804844d <+0>:     push   %ebp
   0x0804844e <+1>:     mov    %esp,%ebp
   0x08048450 <+3>:     and    $0xfffffff0,%esp
   0x08048453 <+6>:     sub    $0x20,%esp
   0x08048456 <+9>:     movl   $0x8048540,(%esp)
   0x0804845d <+16>:    call   0x8048310 <puts@plt>
   0x08048462 <+21>:    lea    0x1c(%esp),%eax
   0x08048466 <+25>:    mov    %eax,0x4(%esp)
   0x0804846a <+29>:    movl   $0x8048555,(%esp)
   0x08048471 <+36>:    call   0x8048320 <scanf@plt>
   0x08048476 <+41>:    mov    0x1c(%esp),%eax
   0x0804847a <+45>:    cmp    $0x208c,%eax
   0x0804847f <+50>:    jne    0x804848f <main+66>
   0x08048481 <+52>:    movl   $0x8048558,(%esp)
   0x08048488 <+59>:    call   0x8048310 <puts@plt>
   0x0804848d <+64>:    jmp    0x804849b <main+78>
=> 0x0804848f <+66>:    movl   $0x8048569,(%esp)
   0x08048496 <+73>:    call   0x8048310 <puts@plt>
   0x0804849b <+78>:    mov    $0x0,%eax
   0x080484a0 <+83>:    leave
   0x080484a1 <+84>:    ret

我要检查的是$0x208c。当我输入x/xw 0x208c时,它会返回一个错误,告诉我不能访问地址0x208c的内存。当我输入信息寄存器并查看eax时,它会显示我提供的值。所以基本上这个程序比较了两个值,根据这两个值打印出一些东西,问题是这是大学的作业,我没有代码。希望你能帮忙。谢谢您。

最佳答案

当我输入x/xw 0x208c时,它会返回一个错误,上面写着Cannot access memory at address 0x208c
程序的反汇编说明它执行如下操作:

puts("some string");
int i;
scanf("%d", &i);  // I don't know what the actual format string is.
                  // You can find out with x/s 0x8048555
if (i == 0x208c) { ... } else { ... }

换句话说,0x208c是程序硬编码的值(8332),而不是指针。因此,gdb完全正确地告诉您,如果将0x208c解释为指针,则该指针不会指向可读内存。
我终于想到用print语句代替x/xw
您似乎不理解printexamine命令之间的区别。举个例子:
int foo = 42;
int *pfoo = &foo;

在上面,print pfoo将给您foo的地址,x pfoo将给您存储在该地址的值(即foo的值)。

关于c - gdb无法访问内存地址错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30139356/

10-12 01:03