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

本文介绍了一个使用C语言定义结构体并结合汇编语言进行内存操作的示例程序。通过定义一个包含多种类型成员变量的结构体REGISTERS,并利用汇编指令逐个读取结构体成员的值,展示了如何在C与汇编混合编程中实现对内存的精确控制。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值