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.pswp.cn/news/378355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378355.shtml
英文地址,請注明出處:http://en.pswp.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,我考慮的則是在產品運營角度上來思考這個問題。否則,一個軟件公司,它的生存與發展就…