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\n" 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\n" 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\n\t""nop\n\t""nop\n\t""nop\n\t""nop"); 20 printf("%d\n", 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\n\t" 21 "movl var1, %eax\n\t" 22 "movl var2, %ebx\n\t" 23 "add %ebx, %eax\n\t" 24 "movl %eax, result\n\t" 25 "popa"); 26 printf("%d\n", 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\n\t" 21 "movl $2, %%ecx\n\t" 22 "mul %%ecx\n\t" 23 "movl %%eax, %%edx" 24 : "=d"(result):"a"(var1), "b"(var2): "%ecx" 25 ); 26 printf("%d\n", 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\n\t" 22 "movl %2, %0\n\t" 23 :"=r"(result):"r"(var1), "r"(var2) 24 ); 25 printf("%d\n", 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\n\t" 22 :"=r"(var2):"r"(var1), "0"(var2) 23 ); 24 printf("%d\n", 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]\n\t" 21 :[myVar2]"=r"(var2):[myVar1]"r"(var1), "0"(var2) 22 ); 23 printf("%d\n", 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\n", result); 24 25 __asm__ __volatile__( 26 "pusha\n\t" 27 "movl var3, %eax\n\t" 28 "movl var4, %ebx\n\t" 29 "add %ebx, %eax\n\t" 30 "movl %eax, addResult\n\t" 31 "popa" 32 ); 33 printf("%d\n", addResult); 34 35 return 0; 36 }
代码异常容易,不多啰嗦了。