zoukankan      html  css  js  c++  java
  • linux下汇编语言汇总

    一、通用寄存器:

      16      32     64       

      AX      EAX    RAX    :累加器,所有IO指令都可用他来与外部设备通信

      BX      EBX    RBX    :计算存储单元地址时常用作基地址寄存器

      CX      ECX    RCX    :常用来保存计数值

      DX      EDX    RDX    :在某些IO操作时,常用来放置IO的端口地址;进行多字节计算时,常常与EAX合作存储高字节部分内容

      SP      ESP    RSP    :堆栈栈顶指针

      BP      EBP    RBP    :栈基址寄存器

      SI       ESI      RSI     :源变址

      DI       EDI      RDI     :目的变址

      段寄存器:

      CS      ECS    RCS    :代码段

      DS      EDS    RDS    :数据段

      SS      ESS    RSS    :堆栈段

      ES      EES    RES    :附加段

      FS      EFS    RFS    :附加段

      GS        EGS      RGS    :附加段

      EFLAGS                :标志寄存器

      使用寄存器时:

      mov  %eax, %ebx      #表示把eax寄存器中的内容复制到ebx寄存器中

      mov  (%eax), %ebx      #表示把eax内地址所指内容复制到ebx寄存器中

      leal  myNum, %ebx       #表示吧myNum变量的地址复制到ebx寄存器中

    二、变量存储分配:汇编语言的.data段存储初始化的变量,.bss段存储未初始化的变量,变量类型有:

      .ascii:    文本字符串

      .asciz:    以NULL结束的文本字符串

      .byte:     字节值

      .double:    双精度浮点数

      .float:     单精度浮点数

      .single:     单精度浮点数

      .short:    16位整型数

      .int:      32位整型数

      .long:      32位整型数

      .quad:     8位整型数

      .octa:      16位整型数

      定义动态变量格式:

      标签:

        变量类型   变量值列表

      定义静态变量格式:

      .equ  变量名  变量值列表

      .lcomm  变量名  变量值列表      本地内存区域

      .comm   变量名  变量值列表      通用内存区域

    三、汇编指令:

      #后面的都是注释内容

      助记符  源数据  目标数据

      目标数据不能是立即数,可以是寄存器,内存地址,变量名

      源数据可以是立即数,可以是寄存器,内存地址,变量名

     1 .section .data
     2     myNum:
     3     .int 8
     4     myGs:
     5     .asciz "%x----%x----%x
    "
     6 .section .text
     7     .globl main
     8     main:
     9         leal myNum, %eax
    10         movl (%eax), %ebx
    11         movl myNum, %ecx
    12         push %ecx                                                                       
    13         push %ebx
    14         push %eax
    15         push $myGs
    16         call printf
    17         push $0
    18         call exit

    编译方法:

     gcc -m32 tests16.s -o tests16       //我是64位系统,为了编译32代码,加上了-m32,默认是64位代码

    结果:

    565bb020----8----8

     其他比较简单,不多说了。注意,上边的代码中实际上调用了C库函数,再看testsE.s

     1 .section .data
     2     myValue:
     3         .byte 67, 68, 69, 70, 0
     4     myGs:
     5         .asciz "%s
    "
     6 .section .text
     7 .globl main
     8 main:
     9     #movl $myValue, %ecx
    10     #push %ecx
    11     push $myValue                                                                       
    12     push $myGs
    13     call printf
    14     push $0
    15     call exit

      编译和运行:

      gcc -m32 testsE.s -o testsE

      CDEF

      其中第9、10行和第11行的代码作用一样

    四、C內联汇编:在C语言中直接嵌入asm语句块,实现汇编代码和C代码的交互,既可以享受汇编的高效和直接,又能借助C语言的特点实现特定的应用。

      1、内联入门:

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午03:18
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** *2020年第45周 11月15日 星期日 下午03:21 (320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int main(int argc, char **argv)
    15 {
    16     int var1 = 88;
    17     int var2 = 2;
    18     int result = var1 + var2;
    19     asm("nop
    	""nop
    	""nop
    	""nop
    	""nop");                                     
    20     printf("%d
    ", result);
    21 
    22     return 0;
    23 }

      上边代码中的第19行,直接调用了asm的汇编代码

      2、和C进行联动,使用C语言中的全局变量:testIn2.c

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn2.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午03:40
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午03:40 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int var1 = 6;
    15 int var2 = 2;
    16 int result;
    17 
    18 int main(int argc, char **argv)
    19 {
    20     asm("pusha
    	"
    21             "movl var1, %eax
    	"
    22             "movl var2, %ebx
    	"
    23             "add %ebx, %eax
    	"
    24             "movl %eax, result
    	"
    25             "popa");
    26     printf("%d
    ", result);
    27                                                                                         
    28     return 0;
    29 }

      编译和运行:

      gcc -m32 testIn2.c -o testIn2

      8

      其实就是第8行代码作用而已。

       3、和C进行联动,将C语言中的局部变量和寄存器绑定:testIn3.c,格式如下:

      asm(“汇编代码”: 输出位置 : 输入位置 : 改动的寄存器列表)其中内联中的寄存器需要使用%%eax表示寄存器eax内容

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn3.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午03:51
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午03:51 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int main(int argc, char **argv)
    15 {
    16     int var1 = 6;
    17     int var2 = 2;
    18     int result;
    19     asm volatile(
    20             "add %%ebx, %%eax
    	"
    21             "movl $2, %%ecx
    	"
    22             "mul %%ecx
    	"
    23             "movl %%eax, %%edx"
    24             : "=d"(result):"a"(var1), "b"(var2): "%ecx"
    25             );
    26     printf("%d
    ", result);                                                             
    27 
    28     return 0;
    29 }

      编译和运行:

      gcc -m32 testsIn3.c -o testsIn3

      16

      4、和C进行联动,采用编译器在编译中将C语言中的局部变量和寄存器通过占位符实现动态的绑定:testIn4.c,格式如下:

      asm(“汇编代码”: 输出位置 : 输入位置 : 改动的寄存器列表)其中内联中的寄存器需要使用%%eax表示寄存器eax内容,将上一步中的寄存器直接用r占位即可

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn4.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午04:17
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午04:17 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int main(int argc, char **argv)
    15 {
    16     int var1 = 6;
    17     int var2 = 2;
    18     int result;
    19 
    20     asm volatile(
    21             "add %1, %2
    	"
    22             "movl %2, %0
    	"
    23             :"=r"(result):"r"(var1), "r"(var2)                                          
    24             );
    25     printf("%d
    ", result);
    26 
    27     return 0;
    28 }

      编译和运行:

      gcc -m32 testsIn4.c -o testsIn4

      8

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn4_1.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午04:39
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午04:39 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int main(int argc, char **argv)
    15 {
    16     int var1 = 2;
    17     int var2 = 6;
    18     //int result;
    19 
    20     asm volatile(
    21             "subl %1, %0
    	"
    22             :"=r"(var2):"r"(var1), "0"(var2)
    23             );
    24     printf("%d
    ", var2);                                                               
    25 
    26     return 0;
    27 }
    ~    

      第22行的0表示var2两次需指定为一个寄存器,否则,多次使用就变为多个寄存器  

       5、和C进行联动,采用编译器在编译中将C语言中的局部变量和寄存器通过占位符实现动态的绑定,通过标识变量:testIn5.c,格式如下:

      asm(“汇编代码”: [标识]输出位置 : [标识]输入位置 : 改动的寄存器列表)r占位符保留

    1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn5.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午04:51
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午04:51 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int main(int argc, char **argv)
    15 {
    16     int var1 = 6;
    17     int var2 = 2;
    18 
    19     asm volatile(
    20             "add %[myVar1], %[myVar2]
    	"                                              
    21             :[myVar2]"=r"(var2):[myVar1]"r"(var1), "0"(var2)
    22             );
    23     printf("%d
    ", var2);
    24 
    25     return 0;
    26 }

      6、和C进行联动,编译器在编译中不优化,加上volatile或者__asm__volatile__:testIn6.c

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testIn6.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月15日的下午05:05
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第45周 11月15日 星期日 下午05:05 (第320天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 #include <stdio.h>
    13 
    14 int var3 = 10;
    15 int var4 = 20;
    16 int addResult;
    17 
    18 int main(int argc, char **argv)
    19 {
    20     int var1 = 6;
    21     int var2 = 2;
    22     int result = var1 * var2;
    23     printf("%d
    ", result);
    24 
    25     __asm__ __volatile__(                                                               
    26             "pusha
    	"
    27             "movl var3, %eax
    	"
    28             "movl var4, %ebx
    	"
    29             "add %ebx, %eax
    	"
    30             "movl %eax, addResult
    	"
    31             "popa"
    32             );
    33     printf("%d
    ", addResult);
    34 
    35     return 0;
    36 }

      代码异常容易,不多啰嗦了。


     

  • 相关阅读:
    运算符和结合性
    几种排序算法 C++
    UNIX环境高级编程笔记
    几个C语言题与答案
    视频流中的DTS/PTS到底是什么 转载
    linux硬链接与软链接 转载
    HTTP POST上传文件(wininet实现)
    并查集(求最小生成树和集团问题)
    c++ vector
    C++STL priority_queue类
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/13976137.html
Copyright © 2011-2022 走看看