2012-10-12 56 views
2

對於我的生活,我無法弄清楚爲什麼這不會打印到屏幕上。不會崩潰或故障,只是退出。是的,我是新人,並且事實上尋找一位導師,如果有人能夠如此善良地幫助它,那將是非常值得讚賞的。Linux大會不打印到標準輸出 - 屏幕

; Hello World in nasm 
; 

; Intel Linux bt 2.6.39.4 #1 SMP x86_64 GNU/Linux 
; NASM version 2.07 
; ld 2.20.1-system.20100303 
; 
; Compile to 32bit with debugging symbols: 
; nasm -g -f elf32 -F dwarf string-w.asm 
; ld -g -melf_i386 -o string-w string-w.o 
; file string-w.asm 

[section .data] 
    msg db  "Hello World",0xa,0x0 
    len equ  $ - msg 

[section .bss] 

[section .text] 

    global _start 

_start: 

    push dword len 
    push dword msg 
    push dword 1 ; Stdout 
    mov eax,0x4  ; write 
    int 0x80 
    ret 
    add esp,12  

    push dword 0 
    mov  eax, 0x1  ; exit 
    int  0x80 

同樣,任何幫助是極大的讚賞,如果有人正在尋找一個學生,我已經準備好當志願者。

+0

您沒有正確使用寫入。 afaik它根本不使用堆棧 –

+0

請查看http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html –

回答

0

你有什麼有看上去很像BSD代碼 - BSD推棧上的參數,並使用INT 80H。 Linux系統調用採用寄存器,ebx,ecx,edx(這就是你所需要的),esi,edi中的參數......甚至可能是ebp。您不需要ret或清理堆棧。

mov edx, len 
mov ecx, msg 
mov ebx, 1 ; file descriptor for stdout 
mov eax, 4 ; sys_write call number (for 32-bit) 
int 80h 

mov ebx, 0 ; exit code 
mov eax, 1 ; sys_exit call number 
int 80h 

要調用write() C庫(其中一些人聲稱是優選的)...

; nasm -f elf32 myprog.asm 
; ld -o myprog myprog.o -I/lib/ld-linux.so.2 -lc -melf_i386 
global _start 
extern write 

section .data 
    msg db "Hello World", 10 
    len equ $ - msg 

section .text 
_start: 
    push len 
    push msg 
    push 1 
    call write 
    add esp, 4 * 3 

    mov ebx, 0 
    mov eax, 1 
    int 80h 

You'll have to link it a little differently. You've got the right idea... in fact you've got two right ideas, you've just got 'em mixed up! :)

Don't try to ret從_start標籤 - 它不叫,它躍升至!

Best, Frank

+0

謝謝大家的回答。你給我提供了豐富的信息和閱讀鏈接,這些信息已被證明非常有用。例如,我不知道寄存器必須按特定順序填充。 Narue寫了一篇很好的入門教程,但它處理所有參數被推入堆棧並使用諸如_printf之類的東西,它們只能在cygwin中運行,而不能在linux上運行。在那張紙上,感謝Narue讓我感興趣,並感謝所有響應讓我着迷的人。 – ayright