smallbarrow 发表于 2007-11-09 09:06

Professional Assembly Language中movtest4例子的一个问题。郁闷了很长时间了。

movtest4.s的源代码如下:
.section .data
      values:
                .int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl main
main:
      nop
      movl values, %eax
      movl $values, %edi
      movl $100, 4(%edi)
      movl $1, %edi
      movl values( , %edi, 4 ), %ebx
      movl $1, %eax
      int $0x80

在用gdb进行movtest4调试的过程中,有如下的情况
Breakpoint 1, main () at movtest4.s:10
10            nop
Current language:auto; currently asm
(gdb) n
11            movl values, %eax
(gdb) print/d values   ----奇怪,应该是10啊
$1 = -9
(gdb) n
12            movl $values, %edi
(gdb) print/d $eax
$2 = 10
(gdb) print/x &values
$3 = 0xc80e60
(gdb) x/40xb 0xc80e60    ----显示的也是奇怪
0xc80e60 <values>:      0xf7    0xff    0xff    0xff    0x88    0x57    0xc7   0x00
0xc80e68 <values+8>:    0xfd    0xff    0xff    0xff    0xb4    0x57    0xc7   0x00
0xc80e70 <values+16>:   0xff    0xff    0xff    0xff    0x39    0x3e    0xc7   0x00
0xc80e78 <values+24>:   0xfc    0xff    0xff    0xff    0xdc    0x57    0xc7   0x00
0xc80e80 <values+32>:   0xfa    0xff    0xff    0xff    0x50    0x3e    0xc7   0x00
(gdb) n
13            movl $100, 4(%edi)
(gdb) print/x $edi
$4 = 0x8049518
(gdb) x/40xb 0x8049518    -----此处显示的反倒是values的数组了
0x8049518 <values>:   0x0a    0x00    0x00    0x00    0x0f    0x00    0x00   0x00
0x8049520 <values+8>:   0x14    0x00    0x00    0x00    0x19    0x00    0x00   0x00
0x8049528 <values+16>:0x1e    0x00    0x00    0x00    0x23    0x00    0x00   0x00
0x8049530 <values+24>:0x28    0x00    0x00    0x00    0x2d    0x00    0x00   0x00
0x8049538 <values+32>:0x32    0x00    0x00    0x00    0x37    0x00    0x00   0x00

我的环境是Fedora4,但是在linux9.0下面也有同样的情况发生。并且值得说明的一点是我用gcc编译和用as,ld编译得到的情况是一样的。哪位帮忙给解释一下吧。

[ 本帖最后由 smallbarrow 于 2007-11-9 11:16 编辑 ]

mik 发表于 2007-11-09 22:09

回复 #1 smallbarrow 的帖子

对 gdb 的用法不了解:mrgreen:

>> (gdb) print/d values   ----奇怪,应该是10啊
>> $1 = -9

print/d values 可能是一个间接引用的语法:输出 0x0000000a 处的内容
0xf7 就等于 -9

>> (gdb) x/40xb 0xc80e60    ----显示的也是奇怪
估计 的值是 0xc80e60,所以打印 0xc80e60 的值得不到你想要的值


>> (gdb) print/x $edi
>> $4 = 0x8049518
>> (gdb) x/40xb 0x8049518    -----此处显示的反倒是values的数组了

movl $values, %edi
%edi 里就是正确的 values 数组里的值,所以这一句结果是正确!

gaocheng 发表于 2007-11-10 00:33

FC5 一切正常啊~~

smallbarrow 发表于 2007-11-12 15:32

谢谢楼上两位,我会根据两位说的情况做一下验证,再次致谢!如果有什么问题,麻烦再次讨论。
页: [1]
查看完整版本: Professional Assembly Language中movtest4例子的一个问题。郁闷了很长时间了。