本文使用intel汇编进行嵌套而非默认的AT&T汇编语法,所以会和其他教程有一些不同
首先介绍如何在clion中完成嵌套intel汇编的开发,需要修改CMake配置文件
cmake_minimum_required(VERSION 3.22)
project(testASM C)
set(CMAKE_C_STANDARD 11)
# 编译选项中添加此选项,如果是在linux下直接使用gcc编译,也需要手动添加 -masm=intel 这个编译选项
add_compile_options(-masm=intel)
add_executable(testASM main.c)
然后介绍下最简单的汇编指令
mov 操作数1 , 操作数2
在intel汇编中,此命令代表将操作数2的内容复制到操作数1中,如果操作数是寄存器,复制的就是寄存器中的值,如果是内存地址,那么就是对应内存地址中的值
下边是C语言代码
#include <stdio.h>
int main() {
int a = 1;
int b = 10;
int c = 2;
printf("%d\n", a);
asm("mov %0, %1" : "=a"(a) : "b"(b));
printf("%d\n", a);
printf("%d\n", c);
asm("mov %0, ebx" : "=m"(c));
printf("%d\n", c);
return 0;
}
代码中使用asm函数进行汇编指令的执行,%0和%1代表占位符,最多可以有10个占位符就是%0到%9。
每个 : 分割开占位符对应的内容,"=a"(a) 代表a变量使用通用寄存器eax并且因为使用等号,所以只能写入,而 "b"(b)代表变量b使用了通用寄存器ebx。"=m"(c)是指c变量使用内存。
第一个asm函数中就是将a和b的值分别绑定到eax和ebx上并将ebx的值赋给eax中。
第二个asm函数中就是将c绑定到内存上并将ebx的值赋给变量c对应的内存中。
所以程序执行完输出的是1,10,2,10