linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
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部分就是关于系统调用的。
linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递相关推荐
- NASM汇编学习01(hello world和IDE)
首先介绍下我使用的汇编IDE(估计很多人汇编都是用记事本写,手动滑稽). SASM汇编IDE,可以在windows上使用,也可以在linux上使用,我的win10物理机和ubuntu22.04虚拟机都 ...
- 操作系统真象还原第1.5章 NASM汇编学习
第二章有使用 NASM 汇编写主引导记录 MBR 的内容. 在写第二章的代码前,每天晚上下班后花一些时间简单地回顾了 NASM 汇编的内容,只复习了最简单的语法,之后写 OS 时再边写边查资料. 指令 ...
- linux中reap用法,ATT汇编学习笔记(一)
file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知$ file a.out a.out: ELF 64-bit LSB ex ...
- [ARM-assembly]-ARM ASM内联汇编学习
★★★个人博客导读首页-点击此处 ★★★ 格式 __asm__ qualifiers ( // 汇编代码部分: OutputOperands //在内联汇编代码中被修改的变量列表: InputOper ...
- linux 下vim的使用(学习必看!!重要)
vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...
- 【超全面】Linux嵌入式干货学习系列教程
文章目录 一.前言 二.Linux基础篇 三.数据结构与算法基础 三.Linux应用篇 四.Linux网络篇 五.ARM篇 六.Linux系统移植篇 七.Linux驱动篇 八.Linux特别篇 九.L ...
- Linux学习系列之Mount
Linux学习系列之Mount 在Linux中,如果你要使用储存设备 (Mo.硬盘.光驱等) ,就得先将它挂上 (Mount),而当储存设备挂上了之后,就可以把它当成一个目录来进行访问.挂上一个设备使 ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- 生信宝典Linux学习系列文章整理
欢迎关注天下博客:http://blog.genesino.com/2017/10/sxbd-linux-summary/ 生信宝典推出的Linux从入门到常用命令.软件安装方法.数据处理方法都在这了 ...
最新文章
- 用命令行管理你的GitHub项目,不必再开网页,官方CLI工具1.0版今日上线
- 系统架构师-基础到企业应用架构-企业应用架构
- 在Docker中运行Dubbo应用
- V7000存储运维使用手册
- 优化你的DiscuzNT3.0,让它跑起来(4)asp.net 缓存和死锁
- leetcode743. 网络延迟时间(迪杰斯特拉算法)
- 训练日志 2018.12.2
- IE9 以下版本浏览器兼容HTML5的方法,使用的静态资源的html5shiv包:
- 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
- Perl学习笔记(二)--标量数据
- windows server 2016 DC重置用户密码报错
- keras指定gpu_keras实现多GPU或指定GPU的使用介绍
- Spring新手教程
- 弹幕助手连接不到服务器,小葫芦obs弹幕助手怎么用 OBS弹幕助手使用教程
- 计算机视觉领域最高奖,数据挖掘研究领域最高奖项公布 优必选AI首席科学家陶大程博士获IEEE ICDM研究贡献奖...
- odoo异常:Expected singleton: res.users()
- 计算机院校考研非歧视,为什么我看不起博士生?
- 第四章 姜诸儿意气风发登君位 鲁桓公窝囊枉死彭生手
- 小程序报错类—— thirdScriptError sdk uncaught third Error Cannot read property '$mount' of unde
- 国外最好用的WordPress主机推荐
热门文章
- 在Vue中遇到的各种坑 及性能提升
- Android底层开发之Audio HAL Android Audio Overview
- itunes app 下载链接的几种表现形式
- LPC43xx SGPIO Pattern Match Mode
- java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别...
- 计算机软考证书英文名称完全翻译指南
- Oracle 添加主键和索引
- java 观察者模式
- leetcode 3.无重复字符的最长子串(中等)
- Docker部署配置相关使用总结