2011-08-01 94 views
6

我正在嘗試在linux上的nasm程序集中打印單個數字的整數。我目前編譯的很好,但沒有任何內容正在寫入屏幕。任何人都可以向我解釋我在這裏做錯了什麼?NASM Linux程序集打印整數

section .text 
    global _start 

_start: 
    mov ecx, 1   ; stores 1 in rcx 
    add edx, ecx  ; stores ecx in edx 
    add edx, 30h  ; gets the ascii value in edx 
    mov ecx, edx  ; ascii value is now in ecx 
    jmp write   ; jumps to write 


write: 
    mov eax, ecx  ; moves ecx to eax for writing 
    mov eax, 4   ; sys call for write 
    mov ebx, 1   ; stdout 

    int 80h    ; call kernel 
    mov eax,1   ; system exit 
    mov ebx,0   ; exit 0 
    int 80h    ; call the kernel again 
+0

您將eax分配給ecx,然後是4.它可能在那裏。 – Josh

+0

[如何在組件NASM中打印數字?](http://stackoverflow.com/questions/8194141/how-to-print-a-number-in-assembly-nasm)可能的重複相關:http:// stackoverflow.com/questions/4117422/more-efficient-way-to-output-an-integer-in-pure-assembly –

回答

6

這增加,不存儲:

add edx, ecx  ; stores ecx in edx 

這將複製ECX到EAX,然後用4覆蓋它:

mov eax, ecx  ; moves ecx to eax for writing 
mov eax, 4   ; sys call for write 

編輯:

對於「寫'系統調用:

eax = 4 
ebx = file descriptor (1 = screen) 
ecx = address of string 
edx = length of string 
+0

我試過這個,它也編譯好,但沒有寫入屏幕。 – FrozenWasteland

+1

我仍然無法正常工作,但我會將其作爲公認的答案。 – FrozenWasteland

+0

@FrozenWasteland - 在這個答案中提到了剩餘的問題,但是沒有特別提醒您注意:「ecx =字符串的地址edx =字符串的長度」,但是您一直試圖提供數據字節本身包含ecx而不是地址和edx中的長度。 –

1

從人2寫入

ssize_t write(int fd, const void *buf, size_t count); 

除了已經指出了其他錯誤,寫()取指針到數據和長度,並非實際本身字節在寄存器正如你試圖提供的那樣。因此,你將不得不將數據從寄存器存儲到內存中,並使用該地址(或者,如果它現在是常量,請不要將數據加載到寄存器中,而是加載其地址)。

+0

鏈接已經死了... –

+0

幸運的是,它並不是答案的關鍵部分,但僅作爲一種便利。 –

3

在回顧了其他兩個答案之後,我終於想到了這一點。

sys_exit  equ  1 
sys_write  equ  4 
stdout   equ  1 

section .bss 
    outputBuffer resb 4  

section .text 
    global _start 

_start: 
    mov ecx, 1     ; Number 1 
    add ecx, 0x30    ; Add 30 hex for ascii 
    mov [outputBuffer], ecx ; Save number in buffer 
    mov ecx, outputBuffer  ; Store address of outputBuffer in ecx 

    mov eax, sys_write   ; sys_write 
    mov ebx, stdout   ; to STDOUT 
    mov edx, 1     ; length = one byte 
    int 0x80     ; Call the kernel 

    mov eax, sys_exit   ; system exit 
    mov ebx, 0     ; exit 0 
    int 0x80     ; call the kernel again 
+0

和lo!對於outputBuffer是神奇的零! – Dru