匯程式設計序的Hello world

2021-09-11 23:02:31 字數 1950 閱讀 7878

**: 

一、匯程式設計序的hello world

x86 at&t:

.data

msg:

.ascii"hello world, hello at&t asm!\n"

len = . - msg

.text

.global _start

_start:

movl    $len,   %edx    # 顯示的字元數

movl    $msg,   %ecx    # 緩衝區指標

movl    $1, %ebx    # 檔案描述符

movl    $4, %eax    # 系統呼叫號,_write

int$0x80       # 系統呼叫

movl    $0, %ebx    # 傳給_exit的引數

movl    $1, %eax    # 系統呼叫號,_exit

int$0x80       # 系統呼叫

然後彙編鏈結再執行:

這段彙編相當於:

#include

charmsg[14] ="hello,world!\n";

#define len 14

intmain(void)

.data段有乙個標號msg,代表字串「hello,world!\n」的首位址,相當於c程式的乙個全域性變數。在彙編指示.ascii定義的字串末尾沒有隱含的『\0』。匯程式設計序中的len代表乙個常量,它的值由當前位址減去符號msg所代表的位址得到,換句話說就是字串「hello,world!\n」的長度。現在解釋一下這行**中的.,彙編器總是從前到後把彙編**轉換成目標檔案,在這個過程中維護乙個位址計數器,當處理到每個段的開頭時把位址計數器置成0,然後每處理一條彙編指示或指令就把位址計數器增加相應的位元組數,在匯程式設計序中用.可以取出當前位址計數器的值,是乙個常量。

在_start中調了兩個系統呼叫,第乙個是write系統呼叫,第二個是以前講過的_exit系統呼叫。在調write系統呼叫時,eax暫存器儲存著write的系統呼叫號4,ebx、ecx、edx暫存器分別儲存著write系統呼叫需要三個引數。ebx儲存著檔案描述符,程序中每個開啟的檔案都用乙個編號來標識,成為檔案描述符,檔案描述符1表示標準輸出,對應的c標準i/o庫的stdout。ecx儲存著輸出緩衝區的首位址。edx儲存著輸出的位元組數。write系統呼叫把從msg開始的len個位元組寫到標準輸出。

c**中的write函式是系統呼叫的包裝函式,其內部實現就是把傳進來的三個引數分別賦給ebx、ecx、edx暫存器,然後執行movl $4,%eax和int $0x80兩指令。這個函式不可能完全用c**寫,因為任何c**都不會編譯生成int指令,所以這個函式有可能完全用彙編寫的,也有可能是c用內聯彙編寫的,甚至是乙個巨集定義。_exite函式野史如此。

分類: 彙編

第乙個匯程式設計序hello world

程式原始碼如下 assume cs code,ds data 定義 段和資料段框架 data segment 資料段 msg db hello world 定義字串 data ends code segment 段 start mov ax,data mov ds,ax 資料段初始化 mov bx,...

匯程式設計序 退出

作為第乙個匯程式設計序,本程式除了退出以外,並沒有執行其他的功能。目的 退出並向linux核心返回乙個狀態碼的簡單程式 輸入 無 輸出 返回乙個狀態碼.在執行程式後可通過輸入echo 來讀取狀態碼 變數 eax儲存系統呼叫號 ebx儲存返回狀態 section data section text g...

微機匯程式設計序

又是自學的一學期,呵呵。學到最後也就知道零星半點指令吧,複雜的程式可能還是不怎麼會寫,熟練當然也不敵c了,但是彙編之於嵌入式,往上走肯定少不了遇到,學好還是必要的!此次僅作入門吧。今日所學,明日之用。1 統計正負零的個數 datas segment array db 1,2,1,0,2,0,2,4,...