【IDA分析学习0x02】除法的优化汇编代码分析

在进行除法运算的时候,编译器可能对除法优化,采用以下的方式运算

 1 .text:00401000                 push    ecx
 2 .text:00401001                 lea     eax, [esp+4+var_4] ; eax指向变量a
 3 .text:00401005                 push    eax
 4 .text:00401006                 push    offset aD       ; "%d"
 5 .text:0040100B                 call    _scanf
 6 .text:00401010                 mov     ecx, [esp+0Ch+var_4] ; ecx为读取到的数
 7 .text:00401014                 mov     eax, 2E8BA2E9h
 8 .text:00401019                 imul    ecx             ; ecx*2e8ba2e9h
 9 .text:0040101B                 sar     edx, 1          ; 优化后的除法 (a*2e8ba2e9h)>>(32+1) = a/11
10 .text:0040101D                 mov     ecx, edx        ; 把商放到ecx中
11 .text:0040101F                 shr     ecx, 1Fh        ; 右移31位
12 .text:00401022                 add     edx, ecx        ; 如果是负数就对结果+1
13 .text:00401024                 push    edx
14 .text:00401025                 push    offset unk_408030
15 .text:0040102A                 call    sub_401040
16 .text:0040102F                 xor     eax, eax
17 .text:00401031                 add     esp, 14h
18 .text:00401034                 retn

另外还有其他好几种优化的方式:http://blog.csdn.net/warlice/article/details/7803626

时间: 2024-08-06 23:49:39

【IDA分析学习0x02】除法的优化汇编代码分析的相关文章

一个简单C程序的汇编代码分析

几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 1 int g(int x) 2 { 3 return x + 10; 4 } 5 6 int f(int x) 7 { 8 return g(x); 9 } 10 11 int main(void) 12 { 13 return f(7) + 5; 14 } 汇编代码分析 1 g: 2 pushl %ebp 3 movl %esp, %ebp 4 :下面

简单C程序生成的汇编代码分析

首先给出完整的C代码: int g(int x){ return x+11;}int f(int x){ return g(x);}int main(void){ return f(8)+1;} 使用命令:gcc –S –o hw001.s hw001.c -m32 对应生成的IA32汇编代码如图所示: 暂不分析以“.”开头的行,得到程序如下: g: pushl %ebp movl %esp ,%ebp movl 8(%ebp) ,%eax addl $11 ,%eax popl %ebp re

常见汇编代码

# 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中 code segment         assume cs:code                   mov ax,32         mov bx,74         mov cx,23                 sort: cmp ax,bx               jge X          ;如果ax大于等于bx就跟cx比较              xchg ax,b

使用hsdis查看jit生成的汇编代码

http://blog.csdn.net/unei66/article/details/26477629 JVM 有 HotSpot引擎可以对热代码路径进行有效的 JIT优化,大幅度提升计算密集代码的性能.默认一个方法至少被调用10k次以上才可能被JIT优化. 查看JIT工作情况 Java代码 [java] view plain copy print? public class VolatileBarrierExample { long a; volatile long v1=1; volati

如何获得即时编译器(JIT)的汇编代码(linux环境下)

1)给定java源代码 // 单例模式(分析volatile关键字是如何禁止指令重排序优化的) public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if(instance == null) { synchronized (Singleton.class) { // 同步块 if(instance == null) { instanc

C编译器剖析_6.3.2 汇编代码生成_由EmitAssign函数产生算术运算的汇编代码

6.3.2  由EmitAssign函数产生算术运算的汇编代码 在这一小节中,我们要讨论的中间指令形如"t1: a+b;"或者"t2:&number",这些指令用于进行一元或二元算术运算,并把运算结果保存在临时变量t1或者t2中.UCC中间指令的格式如下所示: <运算符opcode,目的操作数DST,源操作数SRC1,源操作数SRC2> <ADD,t1,a,b>           //  t1: a+b; <ADDR,t2,n

汇编代码还原第一讲,基本类型以及浮点编码.

目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮点栈 2.浮点汇编 3.使用内联浮点汇编实现加法 四丶布尔类型 地址丶指针丶引用表达形式 常量 #define与const定义 总结: 代码还原技术 一丶简介代码还原 例子一:我们很多人都学习过汇编.但是汇编的核心知识就是我能看的懂.有人拿汇编去做外挂.比如我去追偏移.看着视频去做.然后换一个游戏依

GCC生成的汇编代码

假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){    int t = x + y;    accum += t;    return t;} 这是用echo命令输入源码的效果,简单的就是最好的:) 一.查看GCC生成的汇编代码 在命令行上用“-S”选项,就能看到C编译器产生的汇编代码: #gcc -S code.c 注意:这里是大写的-S,如果用小写gcc会说找不到main函数 会在当前目录下生成code.s文件

【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

[嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 ) 一. 内存 简介 1. 两大内存分类 ( 1 ) DRAM 简介 ( 定期刷新 | 速度慢 | 成本低 ) DRAM 简介 : 1.硬件描述 : DRAM 基本由一个个小电容基本原件组成, 电容的两端保留电荷; 2.优缺点描述 : ① 优点 : 成本很低, 很便宜; ② 缺点 : 需要 定期刷新数据, 速度较慢; a.