C语言中使用asm函数嵌套汇编

本文使用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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值