9 内嵌汇编,可以直接调用系统服务

内嵌汇编 内嵌汇编 操作系统高级教程上面需要阅读Linux内核0.11的源码,其中在书《Linux内核设计的一书》第2.5节异常处理类中段服务程序挂接的部分,遇到了嵌入在C语言中的汇编代码,之前从来没有学习过汇编,因此记录下。 AT&T基础知识 内嵌汇编使用的是AT&T汇编,所以首先稍微讲解下AT&T的汇编指令的基础知识。 操作数前缀 movl $8,%eax movl ... 阅读详情

学习自唐佐林老师,仅作为个人笔记


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

注意 占位符的作用:
当使用如 “r” 等限制符的时候,表示编译器会自动完成寄存器的分配。那么怎么引用这些被编译器自动分配的寄存器呢? 就是通过 %N 的形式加以引用,N可以是从0 到 9,N指示了寄存器在 “输出寄存器”和“输入寄存器” 列表中的索引

#include <stdio.h>

int main()
{
    int result = 0;
    int input = 1;
    
    int a = 1;
    int b = 2;
    
	/*
		开始内嵌汇编,并防止编译器对嵌入的汇编指令进行优化,volatile参数可选
		使用占位符 %1 %0 指定寄存器在 输入输出寄存器列表中的索引
		输出寄存器(列表)关联到变量格式,r 指示编译器自动将通用寄存器关联到变量
		输入寄存器(列表)关联到变量格式
	*/
    asm volatile (
        "movl %1, %0\n"
        : "=r"(result)
        : "r"(input)
        );
        
    printf("result = %d\n", result);
    printf("input = %d\n", input);
    
	/*
		开始内嵌汇编,并防止编译器对嵌入的汇编指令进行优化,volatile参数可选
		直接使用 %%eax %%ebx %%ecx 进行交换操作
		输出寄存器(列表)关联到变量格式  a 指定 eax寄存器  b 指定ebx 寄存器
		输入寄存器(列表)关联到变量格式  a 指定 eax寄存器  b 指定ebx 寄存器
	*/
    asm volatile (
        "movl %%eax, %%ecx\n"
        "movl %%ebx, %%eax\n"
        "movl %%ecx, %%ebx\n"
        : "=a"(a), "=b"(b)
        : "a"(a), "b"(b)
        );
        
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    
    return 0;
}

查看部分 反汇编代码
mhr@ubuntu:~/Desktop/system/qianzhuan/9$ gcc -g 9-1.c 编译并加上调试信息
mhr@ubuntu:~/Desktop/system/qianzhuan/9$ objdump -S a.out 查看反编译的汇编代码

...
0000000000400526 <main>:
#include <stdio.h>

int main()
{
  400526:	55                   	push   %rbp
  400527:	48 89 e5             	mov    %rsp,%rbp
  40052a:	53                   	push   %rbx
  40052b:	48 83 ec 18          	sub    $0x18,%rsp
    int result = 0;
  40052f:	c7 45 e0 00 00 00 00 	movl   $0x0,-0x20(%rbp)
    int input = 1;
  400536:	c7 45 e4 01 00 00 00 	movl   $0x1,-0x1c(%rbp)
    
    int a = 1;
  40053d:	c7 45 e8 01 00 00 00 	movl   $0x1,-0x18(%rbp)
    int b = 2;
  400544:	c7 45 ec 02 00 00 00 	movl   $0x2,-0x14(%rbp)
		开始内嵌汇编,并防止编译器对嵌入的汇编指令进行优化,volatile参数可选
		使用占位符 %1 %0 指定寄存器在 输入输出寄存器列表中的索引
		输出寄存器(列表)关联到变量格式,r 指示编译器自动将通用寄存器关联到变量
		输入寄存器(列表)关联到变量格式
	*/
    asm volatile (
  40054b:	8b 45 e4             	mov    -0x1c(%rbp),%eax //将栈上的内存0x1c位置的数据(input==1) 拷贝到 eax寄存器
  40054e:	89 c0                	mov    %eax,%eax //可省略
  400550:	89 45 e0             	mov    %eax,-0x20(%rbp)  //将 eax寄存器的数据 拷贝到 栈上的内存0x20位置中(result )
        "movl %1, %0\n"
        : "=r"(result)
        : "r"(input)
        );
       
      ...  

内嵌汇编的应用:
在不使用 printf() 的情况下打印字符串

可以通过 INT 80H 使用内核服务
INT 指令用于使用 Linux 内核服务(中断指令)
80H 是一个中断向量号,用于执行系统调用

在这里插入图片描述
存在可选参数 %0 %1 所以寄存器使用 %%

在这里插入图片描述
不存在可选参数 %0 %1 所以寄存器使用 %

#include <stdio.h>

int main()
{
    char* s = "D.T.Software\n";
    int l = 13;
    
    printf("main begin\n");
    
	
	/*
		将立即数4 存储到 eax 寄存器,用于指定编号为4的系统调用:sys_write
		将立即数1 存储到 ebx 寄存器,用于指定 系统调用sys_write 的第一个参数:输出目标
		将占位符%0 拷贝到 ecx寄存器,用于指定 系统调用sys_write 的第二个参数:输出字符串地址
		将占位符%1 拷贝到 edx寄存器,用于指定 系统调用sys_write 的第三个参数:输出字符串长度
		执行系统调用
		输出参数格式,虽然没有 但是需要占位
		输入参数格式
		保留寄存器,因为这里已经使用,所以这里告诉编译器 这几个寄存器不能再用于关联其他变量
	*/
    asm volatile(
        "movl $4, %%eax\n" 
        "movl $1, %%ebx\n"
        "movl %0, %%ecx\n"
        "movl %1, %%edx\n"
        "int $0x80     \n"
        :
        : "r"(s), "r"(l)
        : "eax", "ebx", "ecx", "edx"
    );
    
    
    asm volatile(
        "movl $1,  %eax\n"
        "movl $42, %ebx\n"
        "int $0x80     \n"
    );
    
    
    printf("main end\n");
    
    return 0;
}

在这里插入图片描述
在这里插入图片描述

Linux调试私房菜(四)揭开链接器的面纱、汇编语言的内嵌编程 源文件被编译后生成目标文件,这些目标文件如何生存最终的可执行程序?链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。main()函数是第一个被调用执行的函数吗?链接选项-nostartfiles的意义是什么?链接时不要使用标准的系统启动文件。标准的系统库通常使用,除非使用-nostdlib或-nodefaultlibs。链接器根据什么原则完成具体的工作?在Linux中,进程代码段(.text)的合法起始地址为[0x08048000,0x08049000]8-1.lds8- 阅读详情

相关推荐

PICC 内嵌汇编

有两个原因决定了用 C 语言进行单片机应用程序开发时使用汇编语句的必要性: 单片机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”; 单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会出现 C 和汇编混合编程的情形,我们在此讨论

寒冰 2610

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

on_fighting的专栏 714

linux-0.11 内核源码学习笔记一(嵌入式汇编语法及使用)

  linux内核源码虽然是用C写的,不过其中有很多用嵌入式汇编直接操作底层硬件的“宏函数”,要想顺利的理解内核理论和具体实现逻辑,学会看嵌入式汇编是必修课,下面内容是学习过程中的笔记;当做回顾时的参考。 一、嵌入式汇编语法:   1、格式 1 asm("汇编语句"    //"("之前用asm 或 __asm__ 意为"()"的内容是汇编语句 2 ...

weixin_34377065的博客 312

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9750

使用QGIS配准无人机航片

随着无人机在各个行业的普及,无人机航片成为很多应用系统空间数据的重要来源。无人机航片具有成像快、分辨率高、针对性强的优点,广泛用于保险定损、灾情应急监测、设施巡检、农作物面积调查等方面。 然而,由于种种原因,通过无人机拍摄的照片拼接得到的正射航片与其他地理空间数据叠加时经常出现较明显的偏差,需要进行配准以校正其空间位置,因此,本文将使用QGIS的配准工具演示无人机正射航片配准的过程。 01数据情况 本文选用的示范数据为2020年7月中左右无人机拍摄的河北省某地系列照片,经过拼接得到CG...

QGISClass的博客 5249

linux自带汇编编译器,x86平台,linux下内嵌汇编

x86平台,linux下内嵌汇编Bharata B. Rao ()IBM Linux Technology Center, IBM Software Labs, IndiaMarch 2001如果你是个linux的内核开发人员的话,你发现你会经常编写一些和系统结构有关的函数或者经常优化一段代码,你会经常用在c语言环境下内嵌一段汇编语言.让我们来看看linux下内嵌汇编的用法简要说下GNU汇编编译器...

weixin_33608403的博客 679

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

GCC内嵌汇编

这篇笔记录的内容来自GCC手册中关于内嵌汇编的说明。 通过asm关键字,可以实现在C/C++代码中插入汇编代码,GCC提供了两种格式的内嵌汇编代码:1)基本asm汇编(无操作数);2)扩展asm汇编(有一个或多个操作数)。推荐使用扩展asm汇编,但也有些场景是必须使用基本asm汇编来完成。 基本asm汇编 基本asm汇编语法如下: asm [ volatile ] ( AssemblerInstructions ) asm是GNU扩展的关键字,如果可以使用__asm__(对编译选项有要求),那么

九天小哥的专栏 3765

基于Simulink进行双向DC-DC变换器的仿真建模

特点双向性:可以将能量从一个电压等级转换到另一个,且方向可逆。效率高:通过合理的控制策略减少能量损失。应用广泛:如电池管理系统、混合动力汽车等。挑战拓扑选择:根据应用场景选择合适的电路结构(如buck-boost、full-bridge等)。控制策略:确保高效稳定运行的同时,适应负载变化。热管理:有效散热以保持长期可靠性。首先明确要模拟的任务内容。设计一个能够支持双向能量传输的变换器。根据输入输出电压要求确定合适的变换器拓扑。实现有效的控制策略来维持输出电压稳定。

xiaoheshang_123的博客 367

RAP 时代的 Service Binding:把 CDS 业务服务稳稳地“插”到 OData 里

本文深入解析SAP ABAP开发中的关键对象Service Binding,阐述了如何通过三层架构(数据模型、服务定义、服务绑定)实现业务逻辑与协议分离。文章重点分析了Service Binding的核心参数配置,包括服务命名规范、协议类型选择(OData V2/V4、InA、SQL)及服务形态(UI Service与Web API),并通过实际案例说明不同选项的应用场景。同时介绍了服务版本控制机制、发布流程及Fiori预览功能,帮助开发者理解如何通过Service Binding将业务能力高效转化为可消费

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5712

系统调用003 系统服务表

文章目录前言SystemServiceTable 系统服务表系统服务表在哪判断调用的函数在哪个表API函数的调用过程 前言 我们现在已经知道API怎么从三环进入零环,从三环进零环需要带两个寄存器,分别是eax和edx。eax保存的是系统的服务号,edx保存的是三环的esp,通过esp可以找到三环的参数。 这次要解决的问题是如何通过eax找到零环的函数,零环的函数是怎么被调用的,并且零环的函数执行的...

鬼手的博客 1030

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 210

C语言内嵌汇编

最近阅读linux源码,发现很多以asm volatile开头的C语言内嵌汇编语代码的函数,于是了解了一下,c语言内嵌汇编代码格式为:__ asm __  __ volatile __”(“statements”: “output_regs”:“input_regs”:;clobbered_regs): “__ asm ”表示后面的代码为内嵌汇编,“asm”是“ asm ”的别名。 “...

qq_40712959的博客 2578

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 816

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux C: 内嵌汇编语法

学内嵌汇编首先知道编译器的编译流程,内嵌汇编就是嵌套在高级程序语言中的汇编语言。在cpp 文件转成 .s 汇编文件时,只有高级程序语言会转成汇编,把qian

superSmart_Dong的博客 1926

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

iOS中的内嵌汇编

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者 | sindrilin来源 | sindri...

iOS_开发 579

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GNU 内嵌汇编入门

基本结构 asm ( 汇编语句部分 :输出部分 :输入部分 :寄存器破坏描述符 ) 其中, 汇编语句部分必不可少, 其他三部分可选,但是如果使用了后面的部分,而前面部分为空,也需要用 : 格开,相应部分内容为空。汇编语句部分为一整个字符串, 使用 ; 或 \n 或 \n\t 对每一行进行分隔。 例如: #include <stdio.h> int main(int argc, char const *argv[]) { int input = 12, re..

qq_36525177的博客 502

iOS 中的内嵌汇编

????????关注后回复“进群”,拉你进程序员交流群????????转自:sindrilin的小巢-sindrilinhttp://sindrilin.com/2019/10/23...

iOS_开发 617

字节 汇编_内嵌汇编学习

内嵌汇编学习操作系统高级教程上面需要阅读Linux内核0.11的源码,其中在书《Linux内核设计的一书》第2.5节异常处理类中段服务程序挂接的部分,遇到了嵌入在C语言中的汇编代码,之前从来没有学习过汇编,因此记录下。AT&T基础知识内嵌汇编使用的是AT&T汇编,所以首先稍微讲解下AT&T的汇编指令的基础知识。操作数前缀movl $8,%eax movl $0xf...

weixin_34766547的博客 335

汇编提取栈参数_iOS 中的内嵌汇编

(给iOS大全加星标,关注iOS动态)转自:sindrilin的小巢-sindrilinhttp://sindrilin.com/2019/10/23/write_assembly_in_ios.html写一篇在iOS上使用汇编的文章的想法在脑袋里面停留了很久了,但是迟迟没有动手。虽然早前在做启动耗时优化的工作中,也做过通过拦截objc_msgSend并插入汇编指令来统计方法调用耗时的...

weixin_39964869的博客 162

【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)

上一篇文章学习了链接脚本的语法与相关概念:链接脚本的概念 在继续学习链接器的内容的同时,先学习一个新内容:内嵌汇编。 GCC编译器一般支持C/C++内嵌汇编语言,这样可以实现语言本身无法实现的内容。我们本文主要介绍C语言中的内嵌汇编,C++语言也是一样的规则。 首先要知道以下内容 x86汇编的两种语法:intel语法和AT&amp;amp;T语法 x86汇编一直存在两种不同的语法,在intel的官方文档中...

厚积薄发 4123

修改vb6的编译器c2.exe使它可以输出汇编代码_内嵌汇编学习

内嵌汇编学习操作系统高级教程上面需要阅读Linux内核0.11的源码,其中在书《Linux内核设计的一书》第2.5节异常处理类中段服务程序挂接的部分,遇到了嵌入在C语言中的汇编代码,之前从来没有学习过汇编,因此记录下。AT&T基础知识内嵌汇编使用的是AT&T汇编,所以首先稍微讲解下AT&T的汇编指令的基础知识。操作数前缀movl $8,%eax movl $0xf...

weixin_39747334的博客 338
上一篇: Qt61 视图中的委托1
下一篇: 10 链接器--定制链接脚本 配合使用系统服务 设计体积受限的可执行程序
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值