简单的汇编例子:
.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
这里有个图可以清晰的总结:
编译汇编的两种方式:
1、as sourceCode.s -o objfile.o//编译成为目标文件
ld objfile.o -o execode //连接成可执行文件
2、gcc -o execode sourceCode.s