结构体反汇编解析

代码如下

#include<iostream>
using namespace std;
typedef struct Role {
	int HP;
	int MP;
}*PRole;
int main() {
	Role user;
	PRole puser;
	puser = &user;
	puser->HP = 1500;
	puser->MP = 2000;
	user.HP = 2500;
	user.MP = 3000;
	return 0;
}

基础知识

如果是地址就是采用箭头,箭头是偏移的意思,就像x86内核要取出寄存器的信息,定义一个结构体,然后用偏移来访问各个寄存器的值

实体取出值就是按点(.)来访问

反汇编代码

发现在定义结构体的部分是没有汇编代码的

原因:只有在定义这个结构体变量时候,编译器就去看这个结构体的定义,然后结构体都是基础数据类型组成的,占用内存的大小都是确定的,所以可以通过偏移来访问结构体的成员

	Role user;
	PRole puser;
	puser = &user;
00007FF6EC26185D  lea         rax,[user]  //将user的地址放到rax中
00007FF6EC261861  mov         qword ptr [puser],rax //将user的地址给puser地址指向的内存

可能是现在vscode编辑器的优化,把一些压栈的操作给忽略了,所以更加直白一些

	puser->HP = 1500;
00007FF6EC261865  mov         rax,qword ptr [puser]  //将user地址给到rax,puser是通过栈拿的
00007FF6EC261869  mov         dword ptr [rax],5DCh  //给结构体第一个元素赋值,就像数组一样数组名是第一个元素的地址
	puser->MP = 2000;
00007FF6EC26186F  mov         rax,qword ptr [puser]  //和上面同理
00007FF6EC261873  mov         dword ptr [rax+4],7D0h  //给结构体第二个元素赋值,偏移4个字节,内存中偏移
	user.HP = 2500;
00007FF6EC26187A  mov         dword ptr [user],9C4h  //给结构体第一个元素赋值
	user.MP = 3000;
00007FF6EC261881  mov         dword ptr [rbp+0Ch],0BB8h  //给结构体第二个元素赋值,栈偏移,通过栈来拿这个局部变量

还有一种情况

PRole puser = new Role,这是将在堆中创建了两个int变量,然后puser指向第一个int变量

	Role user;
	PRole puser;
	puser = new Role;
00007FF7B032198C  mov         ecx,8  
00007FF7B0321991  call        operator new (07FF7B032103Ch)  
00007FF7B0321996  mov         qword ptr [rbp+108h],rax  
00007FF7B032199D  mov         rax,qword ptr [rbp+108h]  
00007FF7B03219A4  mov         qword ptr [puser],rax  
	user.HP = 2500;
00007FF7B03219A8  mov         dword ptr [user],9C4h  
	user.MP = 3000;
00007FF7B03219AF  mov         dword ptr [rbp+0Ch],0BB8h

相关推荐

  1. stm32 I2C结构

    2024-05-01 19:48:02       39 阅读
  2. Go中json的解析和

    2024-05-01 19:48:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 19:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 19:48:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 19:48:02       82 阅读
  4. Python语言-面向对象

    2024-05-01 19:48:02       91 阅读

热门阅读

  1. 自动化测试——selenium

    2024-05-01 19:48:02       33 阅读
  2. Docker Error log

    2024-05-01 19:48:02       33 阅读
  3. 每天学习一个Linux命令之dd

    2024-05-01 19:48:02       28 阅读
  4. 使用 Python 和 Keras 实现卷积神经网络

    2024-05-01 19:48:02       31 阅读
  5. 三维装箱问题要点和难点实际应用和案例参考

    2024-05-01 19:48:02       34 阅读
  6. C/C++逻辑与运算与汇编指令的关系

    2024-05-01 19:48:02       30 阅读
  7. Tomcat的请求连接配置

    2024-05-01 19:48:02       32 阅读
  8. 2024年五一联赛数学建模A题思路+代码+论文+结果

    2024-05-01 19:48:02       29 阅读
  9. 2013NOIP普及组真题 1. 计数问题

    2024-05-01 19:48:02       28 阅读
  10. 搜索二叉树模拟实现

    2024-05-01 19:48:02       33 阅读
  11. LP38500/2-ADJ系列

    2024-05-01 19:48:02       35 阅读