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部分就是关于系统调用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript之创建对象(原型模式)

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,它的用途是包含可以有特定类型的所有实例共享的属性和方法。 prototype就是通过构造函数而创建的那个对象的原型对象。使用原型的好处就是可以让所有对象实例…

treeset java_Java TreeSet pollLast()方法与示例

treeset javaTreeSet类pollLast()方法 (TreeSet Class pollLast() method) pollLast() method is available in java.util package. pollLast()方法在java.util包中可用。 pollLast() method is used to return the last highest element and then remove the element from thi…

第五章 条件、循环及其他语句

第五章 条件、循环及其他语句 再谈print和import print现在实际上是一个函数 1,打印多个参数 用逗号分隔,打印多个表达式 sep自定义分隔符,默认空格 end自定义结束字符串,默认换行 print("beyond",yanyu,23)#结果为…

两种方法将Android NDK samples中hello-neon改成C++

一、第一种方法:1.修改helloneon.c 中代码 a.将 char* str; 改为 char str[512] {0}; b.将 asprintf(&str, "FIR Filter benchmark:\nC version : %g ms\n", time_c); 改为 sprintf(str, "FIR Filter benchmark:\nC ve…

【视觉项目】【day6】8.26关于matchTemplate()以及NCC的思考整理

NCC与matchTemplate()函数中match_method TM_CCOEFF_NORMED是否一样? 先看公式: TM_CCOEFF_NORMED NCCTM_CCOEFF_NORMED:归一化的相关性系数匹配方法 NCC:normalized cross correlation:归一化互相关系数 公式是一样的。 参考: 模板匹配的几…

linux待机流程,Linux睡眠喚醒機制--Kernel態

一、對於休眠(suspend)的簡單介紹 在Linux中,休眠主要分三個主要的步驟: 1) 凍結用戶態進程和內核態任務2) 調用注冊的設備的suspend的回調函數, 順序是按照注冊順序3) 休眠核心設備和使CPU進入休眠態, 凍結進程是內核把進程列表中所有的進程的狀態都設置為停止,並且保存下…

strictmath_Java StrictMath log1p()方法与示例

strictmathStrictMath类log1p()方法 (StrictMath Class log1p() method) log1p() method is available in java.lang package. log1p()方法在java.lang包中可用。 log1p() method is used to return (the logarithm of the sum of the given argument and 1 like log(1d) in th…

第六章 抽象

第六章 抽象 自定义函数 要判断某个对象是否可调用,可使用内置函数callable import math x 1 y math.sqrt callable(x)#结果为:False callable(y)#结果为:True使用def(表示定义函数)语句,来定义函数 …

HTTP 状态代码

如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求。 此状态代码提供了有关请求状态的信…

TensorFlow的可训练变量和自动求导机制

文章目录一些概念、函数、用法TensorFlow实现一元线性回归TensorFlow实现多元线性回归一些概念、函数、用法 对象Variable 创建对象Variable: tf.Variable(initial_value,dtype)利用这个方法,默认整数为int32,浮点数为float32,…

linux samba安装失败,用aptitude安装samba失败

版本:You are using Ubuntu 10.04 LTS- the Lucid Lynx - released in April 2010 and supported until April 2013.root下执行aptitude install sambaReading package lists... DoneBuilding dependency treeReading state information... DoneReading extended st…

django第二个项目--使用模板做一个站点访问计数器

上一节讲述了django和第一个项目HelloWorld,这节我们讲述如何使用模板,并做一个简单的站点访问计数器。 1、建立模板 在myblog模块文件夹(即包含__init__.py的文件夹)下面新建一个文件夹templates,用于存放HTML模板,在…

strictmath_Java StrictMath log10()方法与示例

strictmathStrictMath类log10()方法 (StrictMath Class log10() method) log10() method is available in java.lang package. log10()方法在java.lang包中可用。 log10() method is used to return the logarithm of the given (base 10) of the given argument in the method…

30、深入理解计算机系统笔记,并发编程(concurrent)(2)

1、共享变量 1)线程存储模型 线程由内核自动调度,每个线程都有它自己的线程上下文(thread context),包括一个惟一的整数线程ID(Thread ID,TID),栈,栈指针,程序…

PostgreSQL在何处处理 sql查询之十三

继续: /*--------------------* grouping_planner* Perform planning steps related to grouping, aggregation, etc.* This primarily means adding top-level processing to the basic* query plan produced by query_planner.** tuple_fraction i…

【视觉项目】基于梯度的NCC模板匹配代码以及效果

文章目录流程分析工程代码【1】NCC代码【Ⅰ】sttPxGrdnt结构体【Ⅱ】sttTemplateModel模板结构体【Ⅲ】calcAccNCC计算ncc系数函数【Ⅳ】searchNcc NCC模板匹配函数【Ⅴ】searchSecondNcc 二级搜索:在某一特定点周围再以步进为1搜索【2】测试图转外轮廓【Ⅰ】孔洞填…

第七章 再谈抽象

第七章 再谈抽象 对象魔法 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行。(即:无需知道对象的内部细节就可使用它)(无需知道对象所属的类(对象的类型)就能调用其…

c语言math乘法,JavaScript用Math.imul()方法进行整数相乘

1. 基本概念Math.imul()方法用于计算两个32位整数的乘积,它的结果也是32位的整数。JavaScript的Number类型同时包含了整数和浮点数,它没有专门的整型和浮点型。因此,Math.imul()方法能提供类似C语言的整数相乘的功能。我们将Math.imul()方法的…

java scanner_Java Scanner nextLong()方法与示例

java scanner扫描器类的nextLong()方法 (Scanner Class nextLong() method) Syntax: 句法: public long nextLong();public long nextLong(int rad);nextLong() method is available in java.util package. nextLong()方法在java.util包中可用。 nextLong() method…

技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一)

我一直在思考软件公司如何开源节流。当然,老板也在思考开源节流。当然,老板思考的开源节流在公司运营层面上,而我作为CTO,我考虑的则是在产品运营角度上来思考这个问题。否则,一个软件公司,它的生存与发展就…