Chinaunix首页 | 论坛 | 博客
  • 博客访问: 288908
  • 博文数量: 134
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 118
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-01 14:02
文章分类

全部博文(134)

文章存档

2015年(2)

2014年(4)

2013年(128)

分类: C/C++

2013-08-01 14:14:40

原文地址:x86汇编基础 作者:丫叩酱


点击(此处)折叠或打开

  1. 1.#简单汇编程序。用echo $?查看汇编程序结果
  2. .section .data
  3. .section .text
  4. .global _start

  5. _start:
  6.     movl $1,%eax
  7.     movl $4,%ebx
  8.     int $0x80

  9. .end
  10. 3.#定义一个递归函数(错误的),查看函数的运行结果:段错误
  11. #include <stdio.h>

  12. int sum(int n)
  13. {
  14.     int m;
  15.     /*if (n==0)
  16.         return 0;
  17.     else*/
  18.         m=n+sum(n-1);
  19.     return m;
  20. }

  21. int main(int argc, const char *argv[])
  22. {
  23.     printf("%d\n",sum(10));
  24.     return 0;
  25. }
  26. 5.#用汇编实现求几个数的最大值
  27. .section .data
  28. data_items:
  29.     .long 3,67,34,30,45,75,54,34,44,33,22,11,66,0

  30. .section .text
  31. .global _start
  32. _start:
  33.         movl $0,%edi
  34.         movl data_items(,%edi,4),%eax
  35.         movl %eax,%ebx

  36. start_loop:
  37.         cmpl $0,%eax
  38.         je loop_exit
  39.         incl %edi
  40.         movl data_items(,%edi,4),%eax
  41.         cmpl %ebx,%eax
  42.         jle start_loop

  43.         movl %eax,%ebx
  44.         jmp start_loop

  45. loop_exit:
  46.         movl $1,%eax
  47.         int $0x80

  48. .end
  49. 6.#验证本系统是little endian还是big endian

  50. 方法1:用位操作
  51. #include <stdio.h>

  52. int main(int argc, const char *argv[])
  53. {
  54.     int n=0x12345678;
  55.     if((n&0xff)==0x78)
  56.         printf("Little endian!\n");
  57.     if((n&0xff)==0x12)
  58.         printf("Big endian!\n");
  59.     return 0;
  60. }

  61. 方法2:用联合体
  62. #include <stdio.h>

  63. union
  64. {
  65.     char ch;
  66.     int n;
  67. }s;

  68. int main(int argc, const char *argv[])
  69. {
  70.     s.n=0x12345678;
  71.     if(s.ch==0x78)
  72.         printf("little endian!\n");
  73.     if(s.ch==0x12)
  74.         printf("bif endian!\n");
  75.     return 0;
  76. }
  77. 7.#从参数列表中获取多个参数,统计各个单词出现的次数
  78. #include <stdio.h>
  79. #include <string.h>

  80. int main(int argc, const char *argv[])
  81. {
  82.     int arr[100] = {0};
  83.     int i, j;

  84.     for (i = 1; i < argc; i++)
  85.     {
  86.         for (j = 1; j < i; j++)
  87.         {
  88.             if((strcmp(argv[i],argv[j]) == 0)&&(arr[i] != -1))
  89.             {
  90.                 arr[j]++;
  91.                 arr[i] = -1;
  92.             }
  93.         }
  94.         if(arr[i] == 0)
  95.             arr[i]++;
  96.     }

  97.     for (i = 1; i < argc; i++)
  98.     {
  99.         if(arr[i] > 0)
  100.             printf("%s: %d\n",argv[i],arr[i]);
  101.     }
  102.     
  103.     return 0;
  104. }
  105. 8.#查看各种变量的空间分配:
  106.     BBS段:用来存放程序中未初始化的全局变量的一块内存区域。
  107.     数据段:用来存放程序中已初始化的全局变量的一块内存区域。
  108.     堆(heap):用来存放进程运行中被分配的内存段,大小并不固定,可动态扩张或缩减。(例如进程调用malloc等函数分配内存时)
  109.     栈(stack):是用户存放程序临时创建的局部变量,(static声明的变量除外,类似于全局变量)
  110. int val = 3;

  111. void func(void)
  112. {
  113.     static int val_1;
  114.     static int val_2=0;
  115.     static int val_3=1;
  116. }

  117. int main(void)
  118. {
  119.     func();
  120.     return 0;
  121. }

阅读(318) | 评论(0) | 转发(0) |
0

上一篇:预处理 _0224

下一篇:面试常见题 _0227

给主人留下些什么吧!~~