前面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!



.