文档章节

从汇编看for循环

走刀口做大神
 走刀口做大神
发布于 2015/07/03 21:07
字数 308
阅读 12
收藏 0
写一个简短的C语言代码:
int main()
{
    int i;
    for(i=0;i<10;i++)
    {
       printf("%d /n",i);
    }
    return 0;
}
 
照例在编译的时候输出汇编代码,如下:
 
; 3    : int i;
; 4    : for(i=0;i<10;i++)
i=0
       mov DWORD PTR _i$[ebp], 0
跳到循环的开始
       jmp  SHORT $LN3@main
$LN2@main:
i++
       mov eax, DWORD PTR _i$[ebp]
       add  eax, 1
       mov DWORD PTR _i$[ebp], eax
 
循环的起始位置
$LN3@main:
 
以下两条汇编相当于:
if(i>=10)
{
 goto SHORT $LN1@main;
}
cmp DWORD PTR _i$[ebp], 10                 ; 0000000aH
       jge   SHORT $LN1@main
 
 
; 5    : {
; 6    :         printf("%d /n",i);
 
       mov ecx, DWORD PTR _i$[ebp]
       push ecx
       push OFFSET $SG590
       call  _printf
       add  esp, 8
 
; 7    : }
 
       jmp  SHORT $LN2@main
$LN1@main:
 
整个for循环如果再翻译成C语言,那么就相当于下面的样子:
i=0;
loop:
if(i>=0)
{
  goto endloop;
}
printf("%d/n",i);
i++;
goto loop;
 
endloop:
 
很清楚了,让人容易搞错的地方就是会认为“表达式三”比“内嵌语句”先执行,而实际上是内嵌语句先执行,虽然“表达式三”的汇编代码在内嵌语句的前面,也在“表达式二”的前面,通过编译器输出的汇编代码可以得到澄清了。

本文转载自:http://blog.csdn.net/i2cbus/article/details/2887154

走刀口做大神
粉丝 0
博文 4
码字总数 2346
作品 0
南京
程序员
私信 提问
Dalvik :dvmCompilerMIR2LIR

这个函数的主要工作是: 1)将MIR转化为LIR 注意,LIR还不是机器码(MC:machine code),机器码也不完全等于汇编,因为汇编里面还包含了汇编伪指令。 2)优化 例如用java写的循环,如果是很...

RyaneLuo
2013/09/02
71
2
《Linux内核分析》MOOC课程之从迷你Linux内核角度理解进程时间轮片调度(未完)

代码分析 mypcb.h mymain.c 上面这段代码主要完成了对0号进程的初始化,即pid置为0,状态state置为0(即runnable状态),进程入口及当前进程的线程的ip指向myprocess,线程的sp指向当前进程的...

Zha_GW
2015/03/15
325
0
Linux gcc for 循环中 i=i++ 会造成死循环问题及 ++i / i++ 汇编分析

在把 Windows 程序移植到 Linux 时遇到了死循环,最后定位到了类似这种的语句 for (i = 0; i < 1; i = i++), 别问我是谁写的,为什么这么写(泪目!)。 根据我自己的感觉, i = i++ 应该等...

chinaran
2014/12/31
746
14
GNU ARM汇编快速入门

前言: 以前用ARM的 IDE工具,使用的是ARM标准的汇编语言。现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者...

小桥河西
2008/07/07
0
0
并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环

背景 大家都知道线程之间共享变量要用volatile关键字。但是,如果不用volatile来标识,会不会导致线程死循环?比如下面的伪代码: 线程1,线程2同时运行,线程2退出之后,线程1会不会有可能因...

横云断岭
2014/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zk中选举Leader时的网络IO QuorumCnxManager解析

每台服务启动过程中,会启动一个QuorumCnxManager,负责各台服务器之间底层Leader选举过程中的网络通信 当集群中有服务器服务中断时,zk会重新选举leader 内部类 Message定义消息结构 包含了...

writeademo
20分钟前
2
0
使用mdBook 替代 gitbook。

###** 为什么要替代gitbook** gitbook 有个模板问题:如果md文件中有连续的大括号(比如:&{{父亲 40}}),gitbook会把{{ 父亲 40 }}中的父亲 40当做一个模板变量。如果这个变量不存在,会报...

王坤charlie
22分钟前
3
0
TL-A7HSAD采集卡硬件的处理器、NOR FLASH、DDR3

TL-A7HSAD是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的高速数据采集卡,可配套广州创龙TMS320C6655、TMS320C6657、TMS320C6678开发板使用。该采集卡包含1个双通道250MSPS*12Bit的高...

Tronlong创龙
34分钟前
3
0
项目启动报fastjson版本可能过低

进行项目启动的过程中,之前都正常,这次启动突然就失败了: 查看日志说的是版本过低,后来查看官方网站版本,替换了最新版本: 选择了最新版本的1.2.60,1.2.62尝试后都不行,后来查看网上搜...

aiChuang
35分钟前
3
0
McDonald’s is using Alexa and Google to accepting job applications

McDonald’s today announced a new initiative the fast food chain is calling the “Apply Thru,” in which owners of Amazon Alexa or Google Assistant devices can begin job applic......

wowloop
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部