Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译错误_C++_Oop_Assembly - Fatal编程技术网

C++ 编译错误

C++ 编译错误,c++,oop,assembly,C++,Oop,Assembly,我有以下代码: IMAGE_THUNK_DATA* ori_iat; ori_iat += sizeof(IMAGE_THUNK_DATA) generates the asm: MOV EAX, ORI_IAT; ADD EAX, 10h; MOV ORI_IAT; EAX 这不是我想要的,因为图像数据的大小应该是8, 现在我试试这个: IMAGE_THUNK_DATA* ori_iat; DWORD addr = (DWORD)ori_iat; addr += sizeof(IMAGE

我有以下代码:

IMAGE_THUNK_DATA* ori_iat;
ori_iat += sizeof(IMAGE_THUNK_DATA)

generates the asm:

MOV EAX, ORI_IAT;
ADD EAX, 10h;
MOV ORI_IAT; EAX
这不是我想要的,因为图像数据的大小应该是8, 现在我试试这个:

IMAGE_THUNK_DATA* ori_iat;
DWORD addr = (DWORD)ori_iat;
addr += sizeof(IMAGE_THUNK_DATA)
ori_iat = (IMAGE_THUNK_DATA)addr;

generates the asm:

MOV ADDR, ORI_IAT;
ADD ADDR, 4;
MOV ORI_IAT, ADDR;
IMAGE_THUNK_DATA* ori_iat;
ori_iat += (DWORD)sizeof(IMAGE_THUNK_DATA);

generates the asm:

MOV EAX, ORI_IAT
MOV ECX, 10h
LEA EAX, [EAX+ECX*4]
又错了,现在让我们试试这个:

IMAGE_THUNK_DATA* ori_iat;
DWORD addr = (DWORD)ori_iat;
addr += sizeof(IMAGE_THUNK_DATA)
ori_iat = (IMAGE_THUNK_DATA)addr;

generates the asm:

MOV ADDR, ORI_IAT;
ADD ADDR, 4;
MOV ORI_IAT, ADDR;
IMAGE_THUNK_DATA* ori_iat;
ori_iat += (DWORD)sizeof(IMAGE_THUNK_DATA);

generates the asm:

MOV EAX, ORI_IAT
MOV ECX, 10h
LEA EAX, [EAX+ECX*4]
更糟糕的是,我不知道如何告诉编译器我只想在当前指针上加8,这真的很烦人

更新:同时查看图像数据,它有4个DWORD,大小为0x10h,但根据我在Ollydbg的DUMP上看到的关于图像数据结构的内容,它是这样的:

C5 87 87 00 | 00 00 00 00 
DB 87 87 00 | 00 00 00 00 
F7 87 87 00 | 00 00 00 00 
0E 88 87 00 | 00 00 00 00
这让我认为结构的大小实际上是8


已解决:感谢++运算符。我不习惯使用指针,也不习惯使用图像数据结构,它的大小实际上是4。每个图像\u导入\u描述符都指向下一个图像\u THUNK\u数据,所以我很糟糕:)

我想你想要的是

 ori_iat++
因为在信用证中++

       ptr + i
相当于

       &(ptr[i])

我想你想要的是

 ori_iat++
因为在信用证中++

       ptr + i
相当于

       &(ptr[i])

sizeof
返回字节。向指针添加1会按数据类型的大小增加指针的大小

ori_iat += sizeof(IMAGE_THUNK_DATA)
据你所说

ori_iat += 8
因此,这会将
ori_iat
增加
8*sizeof(*ori_iat)
,该值应为64,而不是组件(0x10)中显示的16

因此,
sizeof(IMAGE\u THUNK\u DATA)
必须是16的平方根,即4


实际上,汇编器的下一个片段显示大小实际上是4而不是8(因为您并没有添加到指针,而是添加到普通整数变量,它将直接添加数字)。

sizeof
返回字节。向指针添加1会按数据类型的大小增加指针的大小

ori_iat += sizeof(IMAGE_THUNK_DATA)
据你所说

ori_iat += 8
因此,这会将
ori_iat
增加
8*sizeof(*ori_iat)
,该值应为64,而不是组件(0x10)中显示的16

因此,
sizeof(IMAGE\u THUNK\u DATA)
必须是16的平方根,即4


事实上,汇编程序的下一个片段显示大小实际上是4,而不是8(因为您并没有添加到指针,而是添加到普通整数变量,它将直接添加数字)。

您考虑过帧对齐优化吗?尝试
-O0
您是否考虑过帧对齐优化?试试
-O0
谢谢你的回答,我的结构长度也不对,它的大小是4:)谢谢你的回答,我的结构长度也不对,它的大小是4:)谢谢你的回答,我的图像数据大小不对,它的大小是4,每个图像导入描述符指向下一个记录,但是图像数据之间仍然有4个字节的间隔,不知道为什么。可能是为了填充到8字节…@ffenix修复了答案,第一个版本是错误的(指针的大小与此无关)。我不知道为什么ollydbg会显示4以外的内容。通常通过填充理解的内容包含在struct的
sizeof
中,因为在数组中使用时,
sizeof
必须在数组元素之间分隔。这可能是由于在使用单个结构变量时对齐到8个字节,或者如果在堆中分配,则是由于堆块大小粒度,或者类似的原因。感谢您的回答,我为IMAGE_THUNK_数据设置了错误的大小,其大小为4,每个IMAGE_IMPORT_描述符指向下一条记录,但是图像数据之间仍然有4个字节的间隔,不知道为什么。可能是为了填充到8字节…@ffenix修复了答案,第一个版本是错误的(指针的大小与此无关)。我不知道为什么ollydbg会显示4以外的内容。通常通过填充理解的内容包含在struct的
sizeof
中,因为在数组中使用时,
sizeof
必须在数组元素之间分隔。这可能是由于在使用单个结构变量时对齐到8个字节,或者是由于在堆中分配了堆块大小粒度,或者类似的原因。