C/C++拾遗录--地址方法访问struct结构

#include <stdio.h>

typedef struct __REGISTERS_
{
 unsigned int  EDI;
 unsigned int  ESI;
 unsigned int  EBP;
 unsigned int  ESP;
 unsigned int  EBX;
 unsigned int  EDX;
 unsigned int  ECX;
 unsigned int  EAX;
 unsigned int   EFlags;
 unsigned int reg_return;
}REGISTERS;
/*
    >>>>>>   _declspec(naked) 使用  <<<<<<<<
*/


void ShowStruct(REGISTERS *Regs)
{
 printf("Regs = :0x %x\n",Regs);
 printf("Regs.EDI = :0x %x\n",*Regs);
 printf("Regs.ESI = :0x %x\n",*(Regs+4));
 printf("Regs.EBP = :0x %x\n",*(Regs+8));
 printf("Regs.ESP = :0x %x\n",*(Regs+12));
 printf("Regs.EBX = :0x %x\n",*(Regs+16));
 printf("Regs.EDX = :0x %x\n",*(Regs+20));
 printf("Regs.ECX = :0x %x\n",*(Regs+24));
 printf("Regs.EAX = :0x %x\n",*(Regs+28));
 printf("Regs.EFlags = :0x %x\n",*(Regs+32));
 printf("Regs.reg_return = :0x %x\n",*(Regs+36));
 
}

void ShowRegisters(REGISTERS *Regs)
{
 unsigned int temp;
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax]
 __asm mov temp,ebx
 printf("Regs.EDI = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+4]
 __asm mov temp,ebx
 printf("Regs.ESI = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+8]
 __asm mov temp,ebx
 printf("Regs.EBP = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+12]
 __asm mov temp,ebx
 printf("Regs.ESP = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+16]
 __asm mov temp,ebx
 printf("Regs.EBX = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+20]
 __asm mov temp,ebx
 printf("Regs.EDX = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+24]
 __asm mov temp,ebx
 printf("Regs.ECX = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+28]
 __asm mov temp,ebx
 printf("Regs.EAX = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+32]
 __asm mov temp,ebx
 printf("Regs.EFlags = :0x %x\n",temp);
 __asm MOV eax,Regs
 __asm mov ebx,dword ptr[eax+36]
 __asm mov temp,ebx
 printf("Regs.reg_return = :0x %x\n",temp);

}
int main()

 REGISTERS Regs;
 Regs.EDI=0x12345678;
 Regs.ESI=0x23456789;
 Regs.EBP=0x34567890;
 Regs.ESP=0x45678901;
 Regs.EBX=0x56789012;
 Regs.EDX=0x67890123;
 Regs.ECX=0x78901234;
 Regs.EAX=0x89012345;
 Regs.EFlags=0x90123456;
 Regs.reg_return=0x01234567;
 printf("Regs = :0x %x\n",&Regs);
 printf("Regs.EDI = :0x %x\n",Regs.EDI);
 printf("Regs.ESI = :0x %x\n",Regs.ESI);
 printf("Regs.EBP = :0x %x\n",Regs.EBP);
 printf("Regs.ESP = :0x %x\n",Regs.ESP);
 printf("Regs.EBX = :0x %x\n",Regs.EBX);
 printf("Regs.EDX = :0x %x\n",Regs.EDX);
 printf("Regs.ECX = :0x %x\n",Regs.ECX);
 printf("Regs.EAX = :0x %x\n",Regs.EAX);
 printf("Regs.EFlags = :0x %x\n",Regs.EFlags);
 printf("Regs.reg_return = :0x %x\n",Regs.reg_return);
 ShowStruct(&Regs);
 ShowRegisters(&Regs);
 return 0;
}

/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object.hpp:664:34: error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘struct msgpack::v2::object’ from an array of ‘const msgpack_object’ {aka ‘const struct msgpack_object’} [-Werror=class-memaccess] std::memcpy(&o, &v, sizeof(v)); ^ In file included from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_fwd.hpp:17, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/adaptor/adaptor_base_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base_decl.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object_decl.hpp:16, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack.hpp:10, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/example/cpp03/stream.cpp:10: /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v2/object_fwd.hpp:23:8: note: ‘struct msgpack::v2::object’ declared here struct object : v1::object { ^~~~~~ cc1plus: all warnings being treated as errors make[2]: *** [example/cpp03/CMakeFiles/stream.dir/build.make:63:example/cpp03/CMakeFiles/stream.dir/stream.cpp.o] 错误 1 make[2]: 离开目“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master” make[1]: *** [CMakeFiles/Makefile2:415:example/cpp03/CMakeFiles/stream.dir/all] 错误 2 make[1]: 离开目“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master”
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值