gpt4 book ai didi

c - 为什么在检查构成存储在内存中的编译函数的字节时会得到不正确的结果 "ffff..."?

转载 作者:IT王子 更新时间:2023-10-28 23:34:07 24 4
gpt4 key购买 nike

我一直在深入研究 Linux 和 C,我很好奇函数是如何存储在内存中的。我有以下功能:

void test(){
printf( "test\n" );
}

足够简单。当我在具有此功能的可执行文件上运行 objdump 时,我得到以下信息:

08048464 <test>:
8048464: 55 push %ebp
8048465: 89 e5 mov %esp,%ebp
8048467: 83 ec 18 sub $0x18,%esp
804846a: b8 20 86 04 08 mov $0x8048620,%eax
804846f: 89 04 24 mov %eax,(%esp)
8048472: e8 11 ff ff ff call 8048388 <printf@plt>
8048477: c9 leave
8048478: c3 ret

这一切看起来都不错。有趣的是当我运行以下代码时:

int main( void ) {
char data[20];
int i;
memset( data, 0, sizeof( data ) );
memcpy( data, test, 20 * sizeof( char ) );
for( i = 0; i < 20; ++i ) {
printf( "%x\n", data[i] );
}
return 0;
}

我得到以下信息(不正确):

55
ffffff89
ffffffe5
ffffff83
ffffffec
18
ffffffc7
4
24
10
ffffff86
4
8
ffffffe8
22
ffffffff
ffffffff
ffffffff
ffffffc9
ffffffc3

如果我选择省略 memset(data, 0, sizeof(data)); 行,那么最右边的字节是正确的,但其中一些仍然具有前导 1。

有没有人解释一下原因

  1. 使用 memset 清除我的数组会导致函数表示不正确(或不准确),并且

  2. 这个字节存储在内存中是什么?整数?字符?我不太明白这里发生了什么。 (澄清:我将使用什么类型的指针来遍历内存中的此类数据?)

我的直接想法是,这是 x86 的指令不以字节或半字节边界结束的结果。但这没有多大意义,也不应该造成任何问题。

最佳答案

我相信您的 chars 正在符号扩展 到整数的宽度。通过在打印时显式转换值,您可能会得到更接近您想要的结果。

关于c - 为什么在检查构成存储在内存中的编译函数的字节时会得到不正确的结果 "ffff..."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14105856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com