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)——系统调用和参数传递相关推荐

  1. NASM汇编学习01(hello world和IDE)

    首先介绍下我使用的汇编IDE(估计很多人汇编都是用记事本写,手动滑稽). SASM汇编IDE,可以在windows上使用,也可以在linux上使用,我的win10物理机和ubuntu22.04虚拟机都 ...

  2. 操作系统真象还原第1.5章 NASM汇编学习

    第二章有使用 NASM 汇编写主引导记录 MBR 的内容. 在写第二章的代码前,每天晚上下班后花一些时间简单地回顾了 NASM 汇编的内容,只复习了最简单的语法,之后写 OS 时再边写边查资料. 指令 ...

  3. linux中reap用法,ATT汇编学习笔记(一)

    file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知$ file a.out a.out: ELF 64-bit LSB ex ...

  4. [ARM-assembly]-ARM ASM内联汇编学习

    ★★★个人博客导读首页-点击此处 ★★★ 格式 __asm__ qualifiers ( // 汇编代码部分: OutputOperands //在内联汇编代码中被修改的变量列表: InputOper ...

  5. linux 下vim的使用(学习必看!!重要)

    vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...

  6. 【超全面】Linux嵌入式干货学习系列教程

    文章目录 一.前言 二.Linux基础篇 三.数据结构与算法基础 三.Linux应用篇 四.Linux网络篇 五.ARM篇 六.Linux系统移植篇 七.Linux驱动篇 八.Linux特别篇 九.L ...

  7. Linux学习系列之Mount

    Linux学习系列之Mount 在Linux中,如果你要使用储存设备 (Mo.硬盘.光驱等) ,就得先将它挂上 (Mount),而当储存设备挂上了之后,就可以把它当成一个目录来进行访问.挂上一个设备使 ...

  8. Nginx学习系列二Linux下Nginx实现负载均衡

    关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...

  9. 生信宝典Linux学习系列文章整理

    欢迎关注天下博客:http://blog.genesino.com/2017/10/sxbd-linux-summary/ 生信宝典推出的Linux从入门到常用命令.软件安装方法.数据处理方法都在这了 ...

最新文章

  1. 用命令行管理你的GitHub项目,不必再开网页,官方CLI工具1.0版今日上线
  2. 系统架构师-基础到企业应用架构-企业应用架构
  3. 在Docker中运行Dubbo应用
  4. V7000存储运维使用手册
  5. 优化你的DiscuzNT3.0,让它跑起来(4)asp.net 缓存和死锁
  6. leetcode743. 网络延迟时间(迪杰斯特拉算法)
  7. 训练日志 2018.12.2
  8. IE9 以下版本浏览器兼容HTML5的方法,使用的静态资源的html5shiv包:
  9. 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
  10. Perl学习笔记(二)--标量数据
  11. windows server 2016 DC重置用户密码报错
  12. keras指定gpu_keras实现多GPU或指定GPU的使用介绍
  13. Spring新手教程
  14. 弹幕助手连接不到服务器,小葫芦obs弹幕助手怎么用 OBS弹幕助手使用教程
  15. 计算机视觉领域最高奖,数据挖掘研究领域最高奖项公布 优必选AI首席科学家陶大程博士获IEEE ICDM研究贡献奖...
  16. odoo异常:Expected singleton: res.users()
  17. 计算机院校考研非歧视,为什么我看不起博士生?
  18. 第四章 姜诸儿意气风发登君位 鲁桓公窝囊枉死彭生手
  19. 小程序报错类—— thirdScriptError sdk uncaught third Error Cannot read property '$mount' of unde
  20. 国外最好用的WordPress主机推荐

热门文章

  1. 在Vue中遇到的各种坑 及性能提升
  2. Android底层开发之Audio HAL Android Audio Overview
  3. itunes app 下载链接的几种表现形式
  4. LPC43xx SGPIO Pattern Match Mode
  5. java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别...
  6. 计算机软考证书英文名称完全翻译指南
  7. Oracle 添加主键和索引
  8. java 观察者模式
  9. leetcode 3.无重复字符的最长子串(中等)
  10. Docker部署配置相关使用总结