32/64位系统下使用ATT风格汇编调用c函数

2023-11-30 19:04

本文主要是介绍32/64位系统下使用ATT风格汇编调用c函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

32/64位系统下使用AT&T风格汇编调用c函数

  • 32 位操作系统使用汇编调用 c 函数
    • 演示代码
    • 编译方法
      • gcc 编译汇编
      • as 编译连接汇编
        • 编译
        • 连接
  • 64 位操作系统使用汇编调用 c 函数
    • 演示代码
    • 编译方法
      • gcc 编译汇编
      • as 编译连接汇编
        • 编译
        • 连接

32 位操作系统使用汇编调用 c 函数

演示代码

文件名 : hello.s

.section .dataformat: .asciz "Hello, %s!\n"message: .asciz "World".section .text
.global _start_start:push $messagepush $formatcall printfaddl $8, %esppush $0call exit

编译方法

gcc 编译汇编

使用这种方法需要将 _start 改为 main, 因为 gcc 编译器是从 main 函数开始的

gcc -m32 -o hello hello.s

as 编译连接汇编

在 64 位操作系统下编译 32 位汇编程序,编译上有两种方法:

编译

1、 修改源代码,在源码最顶部加上 .code32 指令(不推荐)
2、 如果不像修改源代码,则需要修改编译参数

```shell
as --32 -o hello.o hello.s
```
连接
ld -m elf_i386 -I /lib/ld-linux.so.2 -L /usr/lib32/ -o cpuid2 -lc cpuid2.o

64 位操作系统使用汇编调用 c 函数

演示代码

.section .dataformat: .asciz "Hello, %s!\n"message: .asciz "World".section .text
.global _start_start:subq $8, %rspmovq $format, %rdimovq $message, %rsixorl %eax, %eaxcall printfaddq $8, %rspmovl $60, %eaxxorl %edi, %edisyscall

编译方法

gcc 编译汇编

使用这种方法需要将 _start 改为 main, 因为 gcc 编译器是从 main 函数开始的
在64位系统中,默认情况下启用 PIE,但在某些情况下,它可能会导致链接错误。因此,我们在这里禁用了 PIE。

gcc -no-pie -o hello hello.s

as 编译连接汇编

编译
as -o hello.o hello.s
连接
ld -I /lib/ld-linux-x86-64.so.2 -L /usr/lib64/ -o hello -lc hello.o

这篇关于32/64位系统下使用ATT风格汇编调用c函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438188

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp