C-汇编(一)
最近还真是挺忙的,做欢神的小内核实验,读书,学汇编,今天一个朋友问了个问题, 内联函数在传指针参数的时候,有没有拷贝这个指针,然后我就尝试写了个代码,汇编看代码,我去!64位的贝尔实验室汇编,老实说我只会32位因特尔汇编。。。。。。。不过基本上差不多,还基本看懂了,过后我有随手写了个简单的C汇编了下,在纸画了画。居然还挺好懂的。
#include<stdio.h> int main2(){ int a = 100; int b = 25 ; if(a > b ){ printf("The higher value is %d %c\n",a,b); }else{ printf("The higher value is %d %c\n",b,a); } return 0; } int main(){ main2(); }
.file "moni.c" ;文件名
.section .rodata
.LC0:
.string "The higher value is %d %c\n"
.text
.globl main2
.type main2, @function
main2:
.LFB0:
.cfi_startproc ;函数开始,进行相关初始化
pushq %rbp ;保存本函数栈指针
.cfi_def_cfa_offset 16 ;定义偏移量
.cfi_offset 6, -16
movq %rsp, %rbp ;设置本程序的栈指针
.cfi_def_cfa_register 6 ;使用寄存器的新值替换旧值
subq $16, %rsp ;预分配栈指针的空间,会以16字节对齐
movl $100, -4(%rbp) ;初始化值
movl $25, -8(%rbp)
movl -4(%rbp), %eax
cmpl -8(%rbp), %eax ;if语句
jle .L2
movl -8(%rbp), %edx
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
jmp .L3
.L2:
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %eax, %esi ;esi 指向实参
movl $.LC0, %edi ;edi 指向变参
movl $0, %eax
call printf ;调用例程
.L3:
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main2, .-main2
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
call main2
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)"
.section .note.GNU-stack,"",@progbits
为了以后提高读写汇编的能力,每天反汇编一个程序,读一读。
查看原文:http://zmrlinux.com/2016/07/15/c-%e6%b1%87%e7%bc%96%ef%bc%88%e4%b8%80%ef%bc%89/
还没有评论,来说两句吧...