博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个简单的汇编例子

Posted on 2011-10-18 14:30  bug yang  阅读(1168)  评论(0编辑  收藏  举报

简单的汇编例子:

.section .data
data_items:
.long 10,2,4,1,7,3,0

.section .text
.globl _start
_start:
movl $0,%edi
movl data_items(,%edi,4),%eax
movl %eax,%ebx

start_loop:
cmpl $0,%eax  //cmpl相当于比较函数
je exit_loop //如果eax==0,那么跳转到exit_loop je中‘e'的意思为’equal‘

incl %edi    //edi递加1
movl data_items(,%edi,4),%eax  //相当于eax=data_items+edi*4,定义eax的地址,也就是data_items数组的第edi个元素
cmpl %ebx,%eax
jle start_loop  //le的意思为"less than or equal“,也就是上面的比较小于或者等于的时候跳转

movl %eax,%ebx
jmp start_loop  //jmp直接跳转

exit_loop:
movl $1,%eax
int $0x80  //产生中断,由用户模式切换到内核模式

在你Linux中:

  使用as sort.s -o max.o 编译

  使用ld sort.o -o max 链接

  使用readelf -a max.o 读取目标文件的ELF Header和Section Header Table

  使用hexdump -C max.o将目标文件的字节全部打印出来。

  使用objdump -d max.o将机器指令反汇编

如何将C语言编译成为汇编文件?

gcc -S temp.c

gcc -c temp.s

gcc temp.o

这里有个图可以清晰的总结:

编译汇编的两种方式:

1as sourceCode.s -o objfile.o//编译成为目标文件

  ld objfile.o -o execode //连接成可执行文件

2、gcc -o execode sourceCode.s