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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对 gdb 的用法不了解
>> (gdb) print/d values ----奇怪,应该是10啊
>> $1 = -9
print/d values 可能是一个间接引用的语法:输出 0x0000000a 处的内容
0xf7 就等于 -9
>> (gdb) x/40xb 0xc80e60 ----显示的也是奇怪
估计 [0x0000000a] 的值是 0xc80e60,所以打印 0xc80e60 的值得不到你想要的值
>> (gdb) print/x $edi
>> $4 = 0x8049518
>> (gdb) x/40xb 0x8049518 -----此处显示的反倒是values的数组了
movl $values, %edi
%edi 里就是正确的 values 数组里的值,所以这一句结果是正确!
FC5 一切正常啊~~
谢谢楼上两位,我会根据两位说的情况做一下验证,再次致谢!如果有什么问题,麻烦再次讨论。