09. C语言内嵌汇编代码


C语言函数内可以自定义一段汇编代码,在GCC编译器中使用 asm 或 __asm__ 关键词定义一段汇编代码,并可选添加volatile关键字,表示不要让编译器优化这段汇编代码。

内嵌汇编代码格式如下:

__asm__
("汇编代码":输出描述:输入描述:修改描述
);


汇编代码部分

汇编代码部分是一个字符串,嵌入的汇编代码使用此字符串存储,多条汇编代码之间使用;符号隔开,字符串可以换行存储,换行存储方式如下:

__asm__
("mov eax,ecx; \add eax,ebx;"
);

或者:

__asm__
("mov eax,ecx;""add eax,ebx;"
);

注:
1.汇编代码中16进制数据只能使用0x前缀,不能使用h后缀。
2.指定内存数据长度时,使用 word prt 关键词,不能省略 prt。
3.内嵌汇编代码默认使用AT&T语法,若使用inter语法则需要在编译时添加如下参数:-masm=intel,本文使用inter汇编语法。


输出描述部分

若汇编代码执行完毕后需要将寄存器、内存单元中的数据保存在C语言代码定义的局部变量中,则需要在输出描述部分定义寄存器或内存单元与局部变量的绑定关系,绑定代码格式如下:

#include <stdio.h>
int main()
{int i;__asm__("mov eax,1; \mov ebx,2; \add eax,ebx;":"=a"(i)          //输出描述部分,"=a"表示输出eax寄存器,(i)表示使用变量i接收输出数据);printf("%d\n", i);return 0;
}


输出描述部分使用简写代码表示要输出的寄存器或内存单元,常用代码如下:
a,表示ax系寄存器
b,表示bx系寄存器
c,表示cx系寄存器
d,表示dx系寄存器
S,表示si系寄存器
D,表示di系寄存器
r,表示自动分配的寄存器
m,表示自动分配的内存单元
g,表示自动分配的寄存器或内存单元


绑定的局部变量可以使用指针指定。

#include <stdio.h>
int main()
{int i;int *p1 = &i;__asm__("mov eax,1; \mov ebx,2; \add eax,ebx;":"=a"(*p1));printf("%d\n", i);return 0;
}


输入描述部分

输入描述用于将局部变量与指定的寄存器或内存单元绑定,绑定的变量会首先复制到对应的寄存器或内存单元,然后再执行汇编代码。

#include <stdio.h>
int main()
{int i1, i2, i3;printf("输入两个整数\n");scanf("%d%d", &i1, &i2);__asm__("add eax,ebx;":"=a"(i3)            //输出描述部分,eax写入i3:"a"(i1), "b"(i2)    //输入描述部分,i1写入eax,i2写入ebx);printf("两数相加结果为:%d\n", i3);return 0;
}


修改描述部分

修改描述用于告知编译器哪些寄存器、内存单元被汇编代码修改过,让编译器在编译代码时对这些寄存器或内存单元进行保护,当然我们也可以手动进行保护,在使用寄存器之前首先将其入栈存储,在汇编代码末尾处还原寄存器。

修改描述注意事项:
1.若被修改的寄存器在输出描述、输入描述中记录过,则无需在修改描述中重复指定,编译器会自动处理。
2.若修改了内存单元,则应该在此部分定义"memory"。
3.若修改了标志寄存器,则应该在此部分定义"c"。

#include <stdio.h>
int main()
{int i1, i2, i3;printf("输入两个整数\n");scanf("%d%d", &i1, &i2);__asm__("add eax,ebx; \mov edx,3; \imul ecx,edx"        //ecx与edx相乘仅做示例,没有实际作用:"=a"(i3)            //输出描述部分,eax写入i3:"a"(i1), "b"(i2)    //输入描述部分,i1写入eax,i2写入ebx:"ecx", "edx"        //修改描述部分,告知编译器ecx、edx被修改过,并且没有在输入输出描述中记录);printf("两数相加结果为:%d\n", i3);return 0;
}


编译器自动分配寄存器、内存单元

在汇编代码中存储数据时可以让编译器自动分配寄存器或内存,汇编代码使用“%数字”的方式调用编译器自动分配的寄存器或内存,比如:%0、%1、%2,这些名称称为占位符,占位符可以不按顺序定义。

占位符可以与输入输出描述中的局部变量绑定,绑定顺序为局部变量在输入输出描述中出现的顺序,%0绑定第一个变量、%1第二个、%2第三个。

#include <stdio.h>
int main()
{int i1, i2, i3;printf("输入两个整数\n");scanf("%d%d", &i1, &i2);__asm__("add %1,%2; \mov %0,%1":"=m"(i3)            //输出描述部分,%0写入i3,这里使用m,表示让编译器自动分配内存单元存储绑定的i3:"r"(i1), "r"(i2)    //输入描述部分,i1写入%1,i2写入%2,这里使用r,表示让编译器自动分配寄存器存储绑定的i1、i2);printf("两数相加结果为:%d\n", i3);return 0;
}

上面汇编代码中三个变量出现顺序是i3、i1、i2,%0绑定i3,%1绑定i1,%2绑定i2。


使用全局变量

在汇编代码中调用全局变量无需进行任何设置,直接使用变量名即可,编译器会自动转换为对应的内存地址。

#include <stdio.h>
int i1, i2;
int main()
{printf("输入两个整数\n");scanf("%d%d", &i1, &i2);__asm__("push rax; \mov eax,i1; \add eax,i2; \mov i1,eax; \pop rax;");printf("两数相加结果为:%d\n", i1);return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 入门

Git 入门 版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 除了项目源代码&#xff0c;你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态&#xff…

WordPress建站入门教程:忘记后台管理员密码了怎么办?

前面跟大家分享的『WordPress建站入门教程&#xff1a;如何在本地电脑搭建WordPress网站&#xff1f;』一文介绍了搭建WordPress网站&#xff0c;但是有些站长跟boke112百科一样&#xff0c;没有记录后台管理密码&#xff0c;这种情况应该怎么办呢&#xff1f;有以下2种方法解决…

我国离子注入设备市场规模不断增加 本土企业仍有较大发展空间

我国离子注入设备市场规模不断增加 本土企业仍有较大发展空间 离子注入是半导体器件和集成电路生产的关键工艺之一&#xff0c;其提供的高精度和高均匀性可以大幅度提高集成电路的成品率。离子注入设备是芯片制造的核心工艺装备。 从全球市场来看&#xff0c;随着科学技术不断进…

javascript基础入门

1.第一个javascript程序 javascript程序不能够独立的运行&#xff0c;必须依赖于HTML文件&#xff0c;type属性值用来说明脚本的类型&#xff0c;这里 是指使用javascript编写的文本文件&#xff1b; 2.alert警告框 alert&#xff08;&#xff09;函数显示一条指定的信息&am…

正大国际:什么是美联储?对于实业与期货市场到底是什么关系?

第一美联储是谁&#xff1f; 美国联邦储备系统&#xff0c;简称美联储(fed)&#xff0c;负责履行美国中央银行的职权。与世界上大部分央行不同&#xff0c;美联储并不完全属于美国政府&#xff0c;从某个角度来说&#xff0c;美联储是一家私有央行。 一家私人银行凌驾于国家之…

创建Net8WebApi自动创建OpenApi集成swagger

问题&#xff1a;用Net8创建WebAPI时勾选启动OpenAPI&#xff0c;项目自动集成了Swagger&#xff0c;但是接口注释没有展示&#xff1f; 解决&#xff1a; 1.需要生成Api项目的XML文件。操作如下&#xff1a; 2.生成XML文件后&#xff0c;还需要在启动类Program.cs里面配置Sw…

架构(十六)本地方法缓存

一、引言 作者需要在底层公共包里面加一个方法反射的工具类&#xff0c;看起来很简单的事&#xff0c;问题也不少&#xff0c;这里讲讲过程。在结合同事的思维误区聊聊本地加锁块的问题。 二、方案选型 其实一开始有两种方案&#xff0c;一种是传入Function和入参&#xff0c;…

selenium_001基本学习

第 1 章webdriver 环境搭建好了&#xff0c;我们正式学习 selenium 的 webdriver 框架&#xff0c;它不像 QTP 之类的有 GUI 界面的可视化工具&#xff0c;是webdriver 框架的 API。 2.1.1 打开网页 注解&#xff1a;我们用谷歌浏览器 # from selenium import webdriver …

ue4.27 发现 getRandomReachedLocation 返回 false

把这个玩意儿删掉&#xff0c;重启工程&#xff0c;即可 如果还不行 保证运动物体在 volum 内部&#xff0c;也就是绿色范围内确保 project setting 里面的 navigation system 中 auto create navigation data 是打开的(看到过博客说关掉&#xff0c;不知道为啥) 如果还不行&…

小兴教你做平衡小车-stm32程序开发(PWM)

1 程序分享 main.c文件。 #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "usart.h" #include "key.h" #include "tim.h" #include "pwm.h" #include "stdio.h"int…

专业的安全数据交换系统,如何进行网间数据安全交换?

网络隔离是企业网络安全管理的重要组成部分&#xff0c;它有助于提高网络的整体安全性&#xff0c;保护企业资产和客户数据&#xff0c;同时满足法规合规要求。很多企业为了防止内部核心数据泄露&#xff0c;都实施了网络隔离&#xff0c;比如划分成内网、外网&#xff0c;有的…

关于爬虫发展历史,价值,问题和应对恶意爬虫的策略

作为一个互联网的技术开发&#xff0c;爬虫不管是自己写的还是所负责的网站被爬&#xff0c;都是挺常见的。 但是一个很常见的东西&#xff0c;却一直没有系统梳理过&#xff0c;今天我们从发展历史&#xff0c;价值&#xff0c;问题和应对恶意爬虫的策略来聊一聊爬虫。 1 爬…

三八妇女节放假么 妇女节放假安排备忘录提醒别忘记

每年的节日像是生活中的小驿站&#xff0c;给我们带来了休息和欢乐。而当三八妇女节临近时&#xff0c;你是否也在期待着那半天的假期呢&#xff1f; 想象一下&#xff0c;公司的走廊里&#xff0c;同事们都在窃窃私语&#xff1a;“三八妇女节会放假吗&#xff1f;”这个问题…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter实现的详细解析

3.2.4.2 自定义starter实现 自定义starter的步骤我们刚才已经分析了&#xff0c;接下来我们就按照分析的步骤来完成自定义starter的开发。 首先我们先来创建两个Maven模块&#xff1a; 1). aliyun-oss-spring-boot-starter模块 创建完starter模块后&#xff0c;删除多余的文件…

PHP设计模式初探 以前写的完整PPT!!!!!

幻灯片 1: 初探PHP设计模式 copyright CSDN 白毛大侠 幻灯片 2: 我们说别人代码写的烂&#xff0c;烂在哪&#xff1f; 反思我们平时是怎么写代码的&#xff1f; 非开发者如何转开发&#xff08;业务&#xff09; &#xff1f; 一.过程与对象 幻灯片 3: <?…

AFL havoc_stage

AFL fuzz_one函数&#xff0c;有个地方判断skip_deterministic &#xff0c;而AFLNet的例子里面&#xff0c;定义了-d参数&#xff0c;也就是skip_deterministic1&#xff0c;直接进入到havoc_stage&#xff0c;所以这里想分析下havoc_stage。 if (skip_deterministic || queue…

Ollama内网离线部署大模型

为了演示方便&#xff0c;我这里选用参数较小的Qwen1.5-0.5B-Chat模型。 下载GGUF模型 访问huggingface下载qwen1_5-0_5b-chat-q5_k_m.gguf模型。 https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GGUF/tree/main注意&#xff1a; huggingface访问不到&#xff0c;可以选择…

华为智慧教室3.0的晨光,点亮教育智能化变革

“教室外有更大的世界&#xff0c;但世界上没有比教室更伟大的地方。” 我们在求学阶段&#xff0c;都听说过这句话&#xff0c;但往往是在走出校园之后&#xff0c;才真正理解了这句话。为了让走出校园的孩子能够有能力&#xff0c;有勇气探索广阔的世界。我们应该准备最好的教…

@德人合科技|公司数据防泄漏软件,防止内部文件数据资料外泄!

现如今&#xff0c;企业都普遍面临数据安全问题的挑战&#xff0c;随着数据泄漏事件不断增加&#xff0c;企业需要强有力的数据防泄漏系统来保护机密信息。 www.drhchina.com 德人合科技 | 公司数据防泄漏软件&#xff0c;防止内部文件数据资料外泄&#xff01; 公司数据防泄漏…

openGauss环境搭建 | 新手指南

一、搭建准备 openGauss开发需要使用linux环境&#xff0c;先下载远程连接工具Xshell/MobaXterm 。 1. 使用工具连接远程linux服务器&#xff0c;使用root账号远程登录&#xff0c;创建个人账号。 useradd -d /home/xxx -m xxx 2. 设置密码。 passwd xxx 3. 切换到个人账…