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 }

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


 

原文地址:https://www.cnblogs.com/guochaoxxl/p/13976137.html