C-汇编(一)

红太狼 2022-09-23 08:41 213阅读 0赞
  1. 最近还真是挺忙的,做欢神的小内核实验,读书,学汇编,今天一个朋友问了个问题, 内联函数在传指针参数的时候,有没有拷贝这个指针,然后我就尝试写了个代码,汇编看代码,我去!64位的贝尔实验室汇编,老实说我只会32位因特尔汇编。。。。。。。不过基本上差不多,还基本看懂了,过后我有随手写了个简单的C汇编了下,在纸画了画。居然还挺好懂的。
  2. #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(); }
  3. .file "moni.c" ;文件名
  4. .section .rodata
  5. .LC0:
  6. .string "The higher value is %d %c\n"
  7. .text
  8. .globl main2
  9. .type main2, @function
  10. main2:
  11. .LFB0:
  12. .cfi_startproc ;函数开始,进行相关初始化
  13. pushq %rbp ;保存本函数栈指针
  14. .cfi_def_cfa_offset 16 ;定义偏移量
  15. .cfi_offset 6, -16
  16. movq %rsp, %rbp ;设置本程序的栈指针
  17. .cfi_def_cfa_register 6 ;使用寄存器的新值替换旧值
  18. subq $16, %rsp ;预分配栈指针的空间,会以16字节对齐
  19. movl $100, -4(%rbp) ;初始化值
  20. movl $25, -8(%rbp)
  21. movl -4(%rbp), %eax
  22. cmpl -8(%rbp), %eax if语句
  23. jle .L2
  24. movl -8(%rbp), %edx
  25. movl -4(%rbp), %eax
  26. movl %eax, %esi
  27. movl $.LC0, %edi
  28. movl $0, %eax
  29. call printf
  30. jmp .L3
  31. .L2:
  32. movl -4(%rbp), %edx
  33. movl -8(%rbp), %eax
  34. movl %eax, %esi esi 指向实参
  35. movl $.LC0, %edi edi 指向变参
  36. movl $0, %eax
  37. call printf ;调用例程
  38. .L3:
  39. movl $0, %eax
  40. leave
  41. .cfi_def_cfa 7, 8
  42. ret
  43. .cfi_endproc
  44. .LFE0:
  45. .size main2, .-main2
  46. .globl main
  47. .type main, @function
  48. main:
  49. .LFB1:
  50. .cfi_startproc
  51. pushq %rbp
  52. .cfi_def_cfa_offset 16
  53. .cfi_offset 6, -16
  54. movq %rsp, %rbp
  55. .cfi_def_cfa_register 6
  56. movl $0, %eax
  57. call main2
  58. popq %rbp
  59. .cfi_def_cfa 7, 8
  60. ret
  61. .cfi_endproc
  62. .LFE1:
  63. .size main, .-main
  64. .ident "GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)"
  65. .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/

发表评论

表情:
评论列表 (有 0 条评论,213人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C基础反汇编

    switch switch性能高于if语句的原因在于在case值较为连续的时候会生成值连续的大表,用switch的参数减去第一个最小的case值,和最大值进行比较,小于等

    相关 [汇编]伪指令()

    \[汇编\]伪指令(一)  段定义伪指令     段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪

    相关 C-汇编

    最近还真是挺忙的,做欢神的小内核实验,读书,学汇编,今天一个朋友问了个问题,  内联函数在传指针参数的时候,有没有拷贝这个指针,然后我就尝试写了个代码,汇编看代码,我去

    相关 汇编学习笔记(

    这只是我学习汇编时候为了防止自己忘记的笔记系列,所以可能没什么条理性,基本上算是0基础开始吧,如果你也要学习,希望对你有帮助(目前会极其没有条理,后来会整理发出来)。 之前