Assembly01: 三个区分问题

以下是我遇到的几个想搞清楚的问题,当时只是把问题记录了下来,再抽时间动手搞清楚。

1)Intel汇编与AT&T汇编

2)C语言中#define和const的汇编区别

3)标准调用__stdcal和C调用__cdecl的区别

一、Intel汇编与AT&T汇编

汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/Visual C++与GNU/Gas采用:

二、#define和const的区别

使用这样一段简单的代码做测试:

1 #define NUM 10
2 #define motd "HELLOWORLD"
3
4 int main()
5 {
6     const int n=20;
7     char* s=motd;
8     return 0;
9 }

汇编的结果是:

6:        const int n=20;
00401028   mov         dword ptr [ebp-4],1Ch
7:        char* s=motd;
0040102F   mov         dword ptr [ebp-8],offset string "HELLOWORLD" (0042201c)

再把生成的可执行文件放到OllyDbg中查看,00422000是这个可执行程序的只读数据段:

内存中数据为:

00422000  00 00 00 00 DF 29 3A 55 00 00 00 00 02 00 00 00  ....?:U.......
00422010  4C 00 00 00 00 00 00 00 00 A0 02 00 48 45 4C 4C  L........?.HELL
00422020  4F 57 4F 52 4C 44 00 00 00 00 00 00 00 00 00 00  OWORLD..........

可以看到#define定义的变量存储在文件只读数据段中,而const修饰的变量直接在栈中管理。

const在汇编后和普通变量的定义是一模一样的。const只是由编译器判断实现的常量,是一个假常量。在实际中,使用const定义的变量,最终还是一个变量,只是在编译器内进行了检查,发现有修改则报错。由于编译器在编译期间对const变量进行检查,因此被const修饰过的变量是可以修改的。利用指针获取到const修饰过的变量地址,强制将指针的const修饰去掉,就可以修改对应的数据内容。

这幅图片摘抄自《C++反汇编与逆向分析技术揭秘》,演示了const修饰的变量被修改后的情况。被const修饰后,变量本质上并没有改变,还是可以修改的。

#define和const的区别

三、__cdecl, __stdcal和 __fastcall的区别

查资料时发现还有__fastcall调用。

调用约定(calling convention)决定一下内容:

1)函数参数的压栈顺序

2)由调用者还是被调用者把参数弹出栈

3)产生函数修饰名的方法

  1 2
__cdel 从右到左 调用函数者
__stdcal 从右到左 被调用函数
__fastcall
从左开始的两个参数放在ECX和EDX

其余参数仍然自右向左压栈

__fastcall参数一般不超过4个字节

被调用函数

__cdecl和__stdcal之间的唯一区别在于返回时是由被调用者清理栈,还是由调用者清理栈。

除了诸如fprintf()这样的参数可变不定长的函数,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况下我们只能使用__cdel。在程序中没有涉及可变参数的情况下,最好使用__stdcall关键字。

时间: 2024-10-25 11:51:49

Assembly01: 三个区分问题的相关文章

Shiro权限控制-区分Ajax请求

一.为什么要区分Ajax请求? 在前台使用EasyUI的系统中,所有的请求可以分为两大类: 1)跳转到页面 2)返回Json数据 这时当请求来了时要区分处理,如果是"跳转到页面"的请求,需要跳到没有权限的页面,否则"返回Json数据"的请求,需要返回一个Json数据{"success":false,"message":"权限不足!"} 二.实现原理分析 2.1 原有实现分析 原来权限执行分析: 1)当用户访

1.模块2.循环导入问题及解决思路3.区分py文件的两种类型4.模块的查找顺序5.模块的绝对导入与相对导入6.项目开发的目录规范

一.模块 什么是模块? 模块就是一系列功能的结合体 模块的三种来源: 1.内置的(python解释器自带的) 2.第三方的(别人写的) 3.自定义的(你自己写的) 模块的四种表现形式: 1.使用python编写的py文件(也就是意味着py文件也是可以称之为模块 2.已被编译为共享库或DLL的或C++扩展(了解) 3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包) 4.使用C编写并连接到Python解释器的内置模块 模块选择 1.用别人写好的模块(内置

课堂笔记:Python基础-文件操作

对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. 白首为功名,旧山松竹老,阻归程. 欲将心事付瑶琴. 知音少,弦断有谁听. f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件 注意 :在Windows系统中,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操

python 读取xml文件

首先,获得标签信息abc.xml <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login username="pytest" password="123456"> <caption>Python</caption> <item id="4&

01《软件需求模式》

这本书可以帮助分析师编写出更好的需求,这些模式提供了一种方法表达关于不同类型需求的全面的结构化知识.需求开发是探险之旅,不只是简单的收集或抄写的过程.所以我选择了这本书作为十月份的阅读书籍. 这本书的目的是帮助决定和定义新的软件系统需要做什么,建议添加哪些额外的特性,使系统更好或者更卓越.这本书的主要读者是涉及决定一个新的软件系统需要什么的任何人.例如说:业务分析师.软件架构师和工程师.软件开发人员.软件测试人员.项目经理. 阅读这本书我将能够定义更好的需求——更详细.准确以及清晰.并且更少的不

python学习笔记文件操作(六)

1.文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 如下文件: 2017-03-24 11:25:06:349 - info: [debug] [AndroidBootstrap] Sending command to android: {"cmd":"shutdown"} 2017-03-24 11:25:06:355 - info: [debug] [AndroidBootstrap] Received command 

python之数据类型

数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型.在Python中,能够直接处理的数据类型有以下几种: 一 Number(数字) 1.1 数字类型的创建 a = 10 b = a b = 666 print(a) # 10 print(b) # 666 注意这里与C的不同: #include <stdio.h> void mai

关于互斥锁,条件变量的内核源码解析

一.解决问题和适用范围 主要是用来等待一个条件,这个条件可能需要另一个线程来满足这个条件.这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区),或者一个变量,但是由于一般来说这个变量的访问是在一个关键区中,所以可以认为是一个关键区. 但是对于条件变量,是需要的是一个事件,只有事件满足的时候才会执行后面的操作,此时就出现一个问题:如果不满足我们应该怎么办?如果如果使用简单信号量,可能另一方触发了这个条件,然后通过unlock来唤醒一个线程

说转型 - 转载

[覃超的回答(91票)]: 说“转型”可能我还不够资格,因为我从工作开始就直接在做mobile,只是之前在大学里面搞过一些程序竞赛和TopCoder的组件开发在桌面电脑上面,所以从一开始我就是还没完全定型的程序员,基本上什么东西都需要从头学习.第一次真正开发mobile程序还是在CMU读master的时候,那时做毕业论文,研究Android系统的安全性,于是第一次装了Android的文档和自己照着样例写了一个,感觉还挺不错(其实就是写Java)再后来就是进入Facebook后,从Boot cam