• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

一段简单c程序的汇编语言学习(ubuntu+x86)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

c程序代码:

 

#include <stdio.h>

int main(void)
{
	int i=0, j=0;

	for(i=0; i<8; i++)
		j=j+1;

	return 0;
}


汇编代码如下:

 

 

.file   "test_asm.c"
      2     .text
      3     .globl  main
      4     .type   main, @function
      5 main:
      6 .LFB0:
      7     .cfi_startproc
      8     pushl   %ebp
      9     .cfi_def_cfa_offset 8
     10     .cfi_offset 5, -8
     11     movl    %esp, %ebp
     12     .cfi_def_cfa_register 5
     13     subl    $16, %esp
     14     movl    $0, -8(%ebp)
     15     movl    $0, -4(%ebp)
     16     movl    $0, -8(%ebp)
     17     jmp .L2
     18 .L3:
     19     addl    $1, -4(%ebp)
     20     addl    $1, -8(%ebp)
     21 .L2:
     22     cmpl    $7, -8(%ebp)
     23     jle .L3
     24     movl    $0, %eax
     25     leave
     26     .cfi_restore 5
     27     .cfi_def_cfa 4, 4
     28     ret
     29     .cfi_endproc
     30 .LFE0:
     31     .size   main, .-main
     32     .ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
     33     .section    .note.GNU-stack,"",@progbits

汇编代码讲解:

 

第8行:将栈基址指针(存在ebp寄存器)推入栈
第11行:将栈指针移入基址指针(esp为基址寄存器)

第13行:从ebp开始分配16字节的内存

第14,15,16行:将i, j赋初值0

第17行:.L2为编译器创建的标号,并跳到.L2执行

第22,23行:将i的与常量7比较,成立则跳到.L3执行

第18行:将j的值加1,i的值加1

最后几行释放局部内存区,并跳转回调用程序(ret)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#获取当前日期当年的周数发布时间:2022-07-14
下一篇:
C/C++结构体字节对齐详解发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap