|
一、通用寄存器:
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位代码
结果:
其他比较简单,不多说了。注意,上边的代码中实际上调用了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 }
代码异常容易,不多啰嗦了。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。
来源:https://www.cnblogs.com/guochaoxxl/p/13976137.html |