linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

2023-10-29

0. 说明

本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程

系统环境搭建:(我用的是ubuntu18.04.4 server,安装gcc、g++)

sudo apt install nasm

sudo apt install gcc-multilib

1. 完整示例

; Hello World Program - asmtutor.com

; Compile with: nasm -f elf helloworld.asm

; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld.o -o helloworld

; Run with: ./helloworld

SECTION .data

msg db 'Hello World!', 0Ah ; assign msg variable with your message string

SECTION .text

global _start

_start:

mov edx, 13 ; number of bytes to write - one for each letter plus 0Ah (line feed character)

mov ecx, msg ; move the memory address of our message string into ecx

mov ebx, 1 ; write to the STDOUT file

mov eax, 4 ; invoke SYS_WRITE (kernel opcode 4)

int 80h

mov ebx, 0 ; return 0 status on exit - 'No Errors'

mov eax, 1 ; invoke SYS_EXIT (kernel opcode 1)

int 80h

编译、链接和运行方法:(其实代码中已经写了)

nasm -f elf helloworld.asm -o helloworld # 可以用nasm -h看帮助信息,-f elf是输出32位elf,-f elf64是64

ld -m elf_i386 helloworld.o -o helloworld # ld是链接器,可以用ld -h看帮助信息,-m elf_i386是格式为i386,也有其他的可选

# Run with:

./helloworld

2. 系统函数调用

Linux的系统调用通过int 80h实现,在此之前需要先要给eax寄存器赋值(opcode,operation code,操作码),例如调用sys_write函数的opcode是4,那么就给eax赋值4:mov eax, 4,类似的sys_exit的opcode为1。

3. 参数传递

参数分别按照依次传递给ebx, ecx, edx,例如sys_write的系统调用:

#include

ssize_t write(int fd, const void *buf, size_t count);

ebx:第一个参数,文件描述符,1是标准输出(0是标准输入,2是错误),这个就是写入到标准输出,即打印到屏幕

ecx:第二个参数,内存地址,传递的是msg,数据段中的地址(SECTION .data)

edx:把待打印的字符数传递给edx

windows c编程中好像有stdcall等函数调用约定,约定参数传递的顺序,是从右至左还是反之

windows 32位下参数通过压栈的方式传递的

当执行到int 80后,因为opcode是4,所以调用sys_write,然后取ebx、ecx、edx作为参数执行,相当于write(1, msg, 13)。

类似的,sys_exit函数为:

#include

void _exit(int status);

把0传递给ebx,然后执行exit,相当于exit(0)。

系统调用的参数列表:可以在linux shell命令行中输入man 2 write man 2 exit查看,man手册第2部分就是关于系统调用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递 的相关文章

  • 计算机二级python(本人整理的所有含答案操作题)

    全国计算机二级 本人整理的所有操作题 包括答案 直接上链接 有道云笔记 喜欢的可以直接下载 本人复习了三天 看了视频 把所有解题记了一遍 直接过了 https note youdao com ynoteshare index html id
  • 机器学习常识 17: 多标签学习

    摘要 多标签学习从标签个数上来扩展数据模型 进一步还有标签分布学习 1 基本概念 多标签学习在 机器学习常识 3 分类 回归 聚类 中简单提到过 这里列举出几个相关概念 一起来讨论下 将训练数据的标签表示为 Y mathbf Y Y 二分类
  • idea搜索不到free mybatis plugins

    作者Gitee主页说明 换行业 不再维护 Jb market也提交了下架 下面有一个peer move and update插件 地址是 https github com chuntungho free mybatis plugins 或者
  • Google登录授权详细过程

    前言 这篇文章包含了google登录授权从API创建 到使用Java代码完成登录的一个完整demo 主要为了实现google关联用户的服务 如google merchant center等 如果仅仅需要使用google邮箱登录 建议由前端实
  • 10个统计分析方法

    为什么要学习统计学习 首先 为了知道如何以及何时使用各种分析方法 理解各种分析方法背后的思想很重要 要想掌握更精巧复杂的方法 你必须先理解较简单的方法 其次 当你想准确地评估一种分析方法的效果时 你得知道其运行的多好或者多么不好 第三 这是
  • Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理 我们将组内一个项目迁移到MDP框架 基于Spring Boot 随后我们就发现系统会频繁报出Swap区域使用量过高的异常 笔者被叫去帮忙查看原因 发现配置了4G堆内内存 但是实际使用的物理内存竟然高达7G
  • 7.1 超级账本

    Matthew Hancock Ed Vaizey以及Linux基金会执行董事Jim Zemlin都认为区块链技术和分布式账本这两个概念是可以互换的 通过分布式账本 几乎任何有价值的东西都可以被跟踪和交易 Jim Zemlin认为 分布式账
  • 10个杀手级应用的Python自动化脚本

    10个杀手级应用的Python自动化脚本 重复的任务总是耗费时间和枯燥的 想象一下 逐一裁剪100张照片 或者做诸如Fetching APIs 纠正拼写和语法等任务 所有这些都需要大量的时间 为什么不把它们自动化呢 在今天的文章中 我将与你
  • VS2012创建ATL工程及使用MFC测试COM组件

    VS2012创建ATL工程及使用MFC测试COM组件 原创 2015年01月22日 16 23 21
  • 浏览器开发者模式F12的基本使用

    chrome浏览器的开发者工具可通过F12快捷键打开 1 调整开发者工具在页面的显示 2 检查界面元素 设备切换 网页或终端 终端选择 断点查看 3 可查看不同手机的界面适配问题 4 如何打断点 5 目标位置界面点击鼠标右键 检查 也可打开
  • ubuntu中conda安装pytorch 和 torch-geometric

    conda创建虚拟环境 conda create n pytorch python 3 7 conda activate pytorch 安装cuda nvidia smi 在这里插入图片描述 https img blog csdnimg
  • 铃木uy125最高时速_6K公里了谈谈轻骑铃木UY125的感受

    这也是很多人关心的 我以前是骑电驴的 电驴的动力弱 上坡无力这些都是常态 大排 公升的我没骑过 所以不谈 仅仅说下我的感受 转弯很灵活 我1米85的个子 极限转弯时 车把不会碰到膝盖 压弯不能太低 会蹭两侧的板子 离地间隙不高 比如上绿化带
  • Qt

    Qt 配置文件QSettings的使用方法 1 简介 配置文件常见的作用是启动软件是保留上次软件退出是的界面状态 如果不保留配置 且软件界面的内容又比较多 重启软件后界面恢复默认 那么每次打开界面都需要重新设置 这样比较麻烦 所以可以使用配
  • Qt中各种消息框对话框的使用

    在程序运行时 经常需要提示用户一些信息 比如警告啊 提示啊 建议啊之类的东西 这些东西基本上是通过消息框与用户进行交互的 Qt中主要是用QMessageBox类来加以实现的 消息框一般分为七种 Question询问消息框 为正常的操作提供一
  • 在小熊派BearPi-HM_Micro_small开发板上安装HAP

    引言 本文介绍如何在小熊派BearPi HM Micro small开发板上安装HAP 参考 https gitee com bearpi bearpi hm micro small blob master applications Bea
  • docker 非root用户修改mount到容器的文件出现“Operation not permitted

    使用环境centos7 x86 64 内核版本4 19 9 docker使用非root用户启动 daemon json配置文件内容如下 cat daemon json userns remap dockertest 映射的user和grou
  • UMG通过参数传递子弹个数给HUD

    今天 看UMG文档 发现无法传递 原因是应该传递到TEXT 而不是EditText 1 在firstpersonCharacter蓝图里 1 创建HUD 并保留HUD指针 2 发射时 子弹数 1 为0时不能发射 3 按R键 子弹数满 25
  • 逻辑回归梯度下降推导

    目录 什么是逻辑回归 逻辑回归的代价函数是怎么来的 逻辑回归求导 参考 什么是逻辑回归 逻辑回归 Logistic Regression 是用于处理因变量为分类变量的回归问题 常见的是二分类或二项分布问题 也可以处理多分类问题 它实际上是属

随机推荐

  • [c++11]多线程编程(五)——unique_lock

    c 11 多线程编程 五 unique lock 转自 https www jianshu com p 34d219380d90 互斥锁保证了线程间的同步 但是却将并行操作变成了串行操作 这对性能有很大的影响 所以我们要尽可能的减小锁定的区
  • el-table树形数据全部展开和收缩(toggleRowExpansion)

    本文主要讲根据element ui文档的toggleRowExpansion实现el table树形数据全部展开和收缩 1 页面效果 2 HTML页面展示 树形数据 直接使用element ui的demo数据 div div
  • Linux下特有的reboot()函数的简介

    1 Linux下c程序通过调用reboot 函数 可以实现系统的重启 挂机 Power Down等功能 2 1 对于libc5或libc4来说 库函数的原型声明中包含四个参数 具体函数原型声明如下 include
  • Linux内核浮点运算

    首次在linux内核驱动使用浮点型运算时出现了 undefined reference to aeabi uidiv 等错误 主要参考 Vedic的博客 toradexsh的博客 根据Vedic的博客修改makefile即可
  • vs2012编译boost_1_53_0

    Boost库的介绍 Boost库是一个经过千锤百炼 可移植 提供源代码的C 库 作为标准库的后备 是C 标准化进程的发动机之一 Boost库由C 标准委员会库工作组成员发起 其中有些内容有望成为下一代C 标准库内容 在C 社区中影响甚大 其
  • 数字签名MD4、MD5

    在本文中 模二加 记为 bigoplus 是二进制位的异或操作 如1模二加1和0模二加1都等于0 1模二加0等于1 模 2 32
  • 对机器进行免密之后还是不能免密登录

    查看远程机器的 var log secure日志 有以下错误 Authentication refused bad ownership or modes for directory home loanusr ssh Authenticati
  • Dynamics CRM2013 Lookup Filtering using addCustomFilter

    dynamics crm中对lookup视图的过滤是一个很平常性的需求 在2011的时候都是用添加自定义视图的方式例如下面这段示例代码 span style font size 18px var pEntityName sc stock v
  • Rust学习资料

    Installing Rust Rustup the Rust installer and version management tool Windows Subsystem for Linux Cargo the Rust build t
  • Spring Security Oauth2 刷新token源码分析

    刷新token请求接口 oauth token 参数 grant type refresh token client id client secret 源码解析 1 grant type为固定值 grant type refresh tok
  • 解决Win10家庭版不能使用grpedit.msc

    前言 大家都认为 Windows 10家庭版中并不包含组策略 其实不然 它是有相关文件的 只是不让你使用而已 那么我们让系统允许你使用就好了 操作步骤 1 首先你需要在桌面上新建一个txt文本文档 然后将以下代码复制到这个新建的txt文本文
  • 常见模拟电路设计 三(含仿真) :文氏桥正弦波发生电路

    参加电赛的过程中遇到了一个需要制作正弦波发生器的任务 这里分享一下方案 对于低频 几十K以下 的正线波信号 完全可以由RC振荡器来实现而不需要引入电感L 文氏桥电路的基本结构 首先 红色箭头标明的是文氏桥电路的桥臂 桥臂既是选频部分 也是正
  • ubuntu 20.04中sources.list文件恢复系统默认源

    前言 ubuntu 20 04中sources list文件恢复系统默认源 小白学习 误该后改不回来 找了很久才找到 做个记录 一 sources list文件恢复系统默认源 1 进入编辑 sources list 代码如下 sudo ge
  • JWT解密和python反序列化之[CISCN2019 华北赛区 Day1 Web2]ikun

    知识点 JWT 和cookie一个类型 用于认证身份 将jwt值放在JSON Web Tokens jwt io解密 可以得到结果 但是想要伪造其他的用户的话需要密钥 密钥使用c jwt cracker 中的 jwtcrack 进行破解 破
  • 浏览器辅助神器:油猴脚本使用教程

    油猴脚本 是一段脚本代码 通过它可以让浏览器实现各种各样的扩展功能 和浏览器扩展的作用类似 比如获去链接重定向 微博页面精简 去广告等 相当于给浏览器开了个挂 可以说是浏览器的辅助神器了 相信很多用户都是通过度盘下载脚本认识它的 但它的功能
  • 华为机试OD真题 javaScript和java 叠积木 堆积木

    叠积木 javascript和java两种方式实现 题目描述 给出一个列表如 6 7 5 4 3 2 表示木块的长和宽 当木块的长和宽不大于另个木块的长和宽时 就可以放在上面 此外数组还可以左右翻转 求最多能搭多少层 输入描述 一个二维数组
  • Shell实现自动更新目录名称与文件中版本号信息与时间戳

    背景 修改如下样例目录下所有目录的版本号信息与时间戳 修改如下样例文件中的版本号信息与时间戳 样例目录 find template patch dir template patch dir template patch dir ONIP S
  • 【爬虫实例】下载英雄联盟所有英雄的皮肤

    爬虫 下载英雄联盟所有英雄的皮肤 import requests import os def download pifu ip response requests get ip result response json print resu
  • MongoDB导出命令

    MongoDB导出 1 MongoDB导出命令 1 MongoDB导出命令 在MongoDB的安装目录的bin目录下 有mongoexport这个命令 可以用于mongo的数据导出 mongoexport h ip port port d
  • linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

    0 说明 本学习系列代码几乎完全摘自 asmtutor com 如果英文可以的 也可以用谷歌浏览器翻译看 可以直接看asmtutor com上的教程 系统环境搭建 我用的是ubuntu18 04 4 server 安装gcc g sudo