1. 程式人生 > >32位組合語言學習筆記(21)--用NASM實現Hello World小程式

32位組合語言學習筆記(21)--用NASM實現Hello World小程式

前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。

首先需要安裝NASM彙編器,例如:

rpm –ivh nasm-2.10-1.i386.rpm

Assembly Language step by step programming with linux》書中的第一個彙編程式叫eatsyscall,我把它改寫成一個HelloWorld小程式。

SECTION .data                    ; Section containing initialised data
    HelloMsg:db "Hello World!",10
    HelloLen:equ $-HelloMsg 

SECTION .bss                    ; Section containing uninitialized data    

SECTION .text                   ; Section containing code

global  _start                 ; Linker needs this tofind the entry point!

_start:
    nop                             ; This no-op keeps gdbhappy...
    mov eax,4                  ; Specify sys_writecall
    mov ebx,1                  ; Specify FileDescriptor 1: Standard Output

    mov ecx,HelloMsg    ; Pass offset ofthe message
    mov edx,HelloLen     ; Pass the lengthof the message

    int 80H                        ; Make kernelcall

    mov eax,1                  ; Code for ExitSyscall
    mov ebx,0                  ; Return a code ofzero   

    int 80H                        ; Make kernelcall

程式的英文註釋已經解釋的很清楚了:程式共做了兩個系統呼叫(int 0x80)eax暫存器儲存系統呼叫號,系統呼叫號4表示sys_write,系統呼叫號1表示sys_exit

對於sys_write,共有3個傳入引數,分別儲存在暫存器ebxecxedx中。ebx儲存的是檔案描述符,1表示標準輸出。ecx儲存的是訊息字串的地址,edx儲存的是訊息字串的長度。

對於sys_exit系統呼叫,只有一個傳入引數,表示程式的退出碼,ebx儲存0,就是說退出碼是0

HelloMsg: db "Hello World!",10

HelloMsg是在資料段(.data)中定義的字串標號,db表示define byte。也就是說HelloMsg表示一個位元組陣列,10是換行符(\n)的ASCII碼值。

HelloLen:equ $-HelloMsg

HelloLen是字串長度的標號,equ表示等同於,$是一個指示當前位置的變數,表示HelloMsg位元組陣列的最後一個位元組後面的那個位元組的位置,$減去HelloMsg(字串陣列的第一個位元組的位置),得到的恰好是位元組陣列的長度,這個長度值由彙編器在編譯時計算得到。

使用如下makefile檔案來生成程式:

helloworld: helloworld.o
	ld -m elf_i386 -o helloworld helloworld.o

helloworld.o: helloworld.asm
	nasm -f elf32 -g -F stabs helloworld.asm -l helloworld.lst

-f elf32:生成elf32格式的目標檔案。

-g:生成除錯資訊。

-F stabs:生成STABS格式的除錯資訊。

[[email protected] helloworld]# make

nasm -f elf32 -g -F stabs helloworld.asm -lhelloworld.lst

ld -o helloworld helloworld.o

[[email protected] helloworld]# ./helloworld

Hello World!





相關推薦

32組合語言學習筆記(21)--NASM實現Hello World程式

前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。首先需要安裝NASM彙編器,例如:rpm –ivh nasm-2

32組合語言學習筆記(32)--loop指令

 loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令: dec ecx jne label 如下是使用loop指令的一個示例程式: section .data EditBuff: db 'abcdefghijklm',10 BUFFERL

32組合語言學習筆記(12)--分析switch語句的彙編程式碼

switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。int switch_eg(int x){int result = x;switch (x) {case 100:result*= 1

32組合語言學習筆記(41)--fgets等函式的使用

 在《32位組合語言學習筆記(13)--函式的呼叫》曾分析過c函式的呼叫過程,對於c函式的預設呼叫約定cdecl,要求函式引數的壓棧順序是從右向左,由呼叫方來清理棧。下面示例程式會使用libc庫的幾個函式: char *fgets( char *string, int

使用nasm在windows上實現hello world程式

nasm和masm使用上有一定的語法區別,而windows環境的nasm教程有較少,經過自己研究,寫下這個教程 org 0100h ;PSP字首,程式從0100h開始執行 mov ax, cs ;初始化 ds和dx暫存器,為呼叫9號程式(顯示字串)做準備 mov ds,

【SSH學習筆記Struts2實現簡單的戶登錄

utf-8 png rds href -a his ets 屬性 url 準備階段 在使用學習Struts2的時候首先要下載相應的架包 Struts2資源下載 這裏建議下載第一個,在struts-2.5.14.1-all.zip裏有很多實用的東西,不僅有架包還有官方為開發

nginx學習筆記(一) nginx實現本地https請求轉http請求

error erro 需要 ror har file key media nginx代理 接到項目需求需要將一些https請求利用nginx代理到http接口上,因此要在本地上搭環境進行測試,現在將該過程記錄一下。 生成證書 1. 使用openssl生成密鑰privkey.

【NLP學習筆記jieba實現高頻詞提取

高頻詞 高頻詞提取(TF,Term Frequency),高頻詞指在文件中出現頻率較高並且有用的詞,關鍵點有兩個:出現頻率高、有用。 第一步 定義獲取語料的函式 def getContent(path,encoding='gbk): with open(

機器學習學習筆記之一——python實現簡單一元函式、二元函式的梯度下降

  今天開始正正經經,好好的寫機器學習的筆記。   再一次從頭翻過來學機器學習,在有一些python和大學數學的基礎下,首先要搞的果然還是梯度下降,本篇記錄的是用jupyter完成的一次作業:python實現一維陣列和二維陣列的梯度下降,目的只在於熟悉梯度下降。 第一部分

Django學習筆記(第二節)Hello World站點

檢視和URL配置 建立檢視 在上一節建立的mysite資料夾中建立一個叫做 view.py的空檔案,這就是檢視檔案。Django對這個檔案的名稱沒有特殊要求,但一般約定為view.py。 輸入以下內容: from django.http import HttpRespo

【JavaEE學習筆記】Spring_01_工廠模式,Spring程式,IoC控制反轉

Spring_01 A.工廠模式 1.概述 是由專家總結出來的,在某種情況下解決某類問題的最佳解決方案 設計模式六大原則 單一職責原則 里氏替換原則 依賴倒置原則 介面隔離原則 迪米特法則 開

大道至簡 知易行難 JAVA 完成WebSocket demo GoEasy實現Hello world

  一個專案在方向、目標和運營理念已經定義了的時候,我們會去考慮專案本身的週期和開發成本。當然,所有的公司都會在專案能夠達成目標的同時儘量減少人力成本和時間成本,其中,就會有用到三方的軟體和框架。         大道至簡 知易行難,作為一名開發人員站在開發的角度上來講,怎

OPENCV學習筆記16_控制器設計模式實現功能模塊間通信

.get src read require char http result div exe   在構建更復雜的程序時,需要創建多個算法來協同工作,以實現一些高級功能。要合理地構建程序並讓所有的類能互相通信,程序將會變得越來越復雜。因此在一個類中集中對程序進行控制,是非常有

Python學習筆記21(讀取配置文件)

文件 class strong color () for 新的 -i .config 1、基本的讀取操作 -read(filename) 直接讀取文件內容 -sections() 得到所有的sectio

Hadoop學習筆記21.Hadoop2的改進內容簡介

做的 說明 後者 實踐 管理系 一個 變化 它的 軟件 Hadoop2相比較於Hadoop1.x來說,HDFS的架構與MapReduce的都有較大的變化,且速度上和可用性上都有了很大的提高,Hadoop2中有兩個重要的變更: (1)HDFS的NameNode可以以集群的方式

六LWIP學習筆記戶數據報協議(UDP)

端口 數據結構 筆記 udp協議 pos body 校驗 傳輸 連接 一、背景知識 1、傳輸層協議 2、UDP協議 3、端口 4、UDP報文的交付 5、UDP報文格式 6、UDP偽首部與校驗和 二、UDP數據結構 1、報文首部結構 2、控制塊 三、控制塊操作函數 1、使用U

八LWIP學習筆記戶編程接口

log pos 數據 用戶數據 div 操作 套接字函數 函數 實現 一、定時事件 1、定時結構 2、定時鏈表 3、內核進程 4、處理定時事件 二、消息機制 1、消息結構 2、數據包消息 3、協議棧API實現 4、API消息 三、協議棧接口 1、用戶數據緩存netbuf 2

Thinking in Java第七章學習筆記----復

obj class 都是 一個 per private gpo toon on() 復用代碼,即使用已經開發並調試好的類。組合和繼承是兩種實現方法。 組合語法:   在新類中創建現有類的對象。該方法只是復用了現有代碼的功能,而非它的形式。   組合的例子隨處可見,這裏不舉例

【數據分析學習筆記戶行為分析模型

密度 登錄用戶 精細化分析 做出 新版 分享圖片 結合 評價 指定 一、行為事件分析 1.什麽是行為事件分析 企業追蹤或記錄的用戶行為或業務過程,如用戶註冊、瀏覽產品詳情頁、成功投資、提現等,通過研究與事件發生關聯的所有因素來挖掘用戶行為事件背後的原因、交互影響等。 2.行

LWIP學習筆記戶編程接口(NETCONN)(八)

socket api con 數據 實現 學習 數據緩存 用戶 soc 一、定時事件 1、定時結構 2、定時鏈表 3、內核進程 4、處理定時事件 二、消息機制 1、消息結構 2、數據包消息 3、協議棧API實現 4、API消息 三、協議棧接口 1、用戶數據緩存netbuf