2011-01-28 85 views
1

我對彙編語言使用those video tutorials。 我基本上試圖解決「hello world」asm例子。 以下是我有:簡單的彙編系統調用不起作用

.data 
str: 
     .ascii "Hello World" 

.text 
.globl _start 

_start: 
     movl $4, %eax 
     movl $1, %ebx 
     movl $str, %ecx 
     movl $11, %edx 
     int  $0x80 

     movl $1, %eax 
     movl $0, %ebx 
     int  $0x80 

這編譯就好了,但是當我運行它,沒有文本打印到終端。我不知道我在做什麼錯。無論什麼價值,我進入ecx寄存器沒有任何區別,沒有任何反應。

另外,還有其他問題,系統調用在調用int 0x80指令時如何工作? 有些數據已被移動到寄存器,但是當我們到達系統調用時,它不會「使用」任何這些值。它是否會得到什麼已被移動到它自己的寄存器?

一些系統信息可能會有所幫助:

[email protected] ~/dev/asm/tutorial > uname -a 
FreeBSD freebsd-9 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006  [email protected]:/usr/obj/usr/src/sys/GENERIC i386 
+1

我個人認爲,通過學習系統調用,「hello world」,調用約定和其他依賴於OS的功能來啓動程序集是一個壞主意。我通常建議學習使用調試器並編寫一些可以單步執行的自包含asm程序,例如總結一個小陣列。一旦您對基本說明感到滿意並獲得程序集的竅門,您就可以輕鬆地學習各種其他事情,從而瞭解系統調用甚至可能無用。但這只是我瘋狂的看法:) – Jester 2011-01-29 02:11:45

回答

0

您必須%EBX設置爲0(標準輸出)。您當前的值(1)表示stdin。

+0

這是退出系統調用狀態參數,而不是我正在寫的FD。 – dotminic 2011-01-28 19:25:04

+0

stdin爲0,stdout爲1 stderr爲2 – 2011-01-31 20:54:44

+0

@Fire Crow:在linux上stdin是1,stdout是0.我沒有看到他正在運行freeBsd。 – BlackBear 2011-01-31 21:11:43

1

FreeBSD有越 '通常' 調用 約定,其中所述系統調用號碼 是在EAX,和參數是上 堆棧

檢查在這個hello world的freebsd部分中彙編totorial

我去了ubuntu和netbsd之間,這幫助我寫程序集

* bsd使用一個堆棧來存儲文件des的參數和要寫入的字節的長度,在Linux中它只是保存在寄存器eax和這是linux風格的ebx,就像你在你的例子中那樣。

在linux: _start:;告訴接頭入口點 MOV EDX,LEN;消息長度 MOV ECX,MSG;消息寫 MOV EBX,1;文件描述符(STDOUT) MOV EAX,4;系統來電號碼(SYS_WRITE) INT 0x80的;調用內核在freebsd

_syscall: 
    int0x80;system call 
    ret 

_start:;tell linker entry point 

    pushd word len;message length 
    pushd word msg;message to write 
    pushd word 1;file descriptor (stdout) 
    move ax,0x4;system call number (sys_write) 
    call _syscall;call kernel 

使用系統調用堆棧版本在* BSD