2016-04-27 130 views
1

我有以下程序寫在NASM大會:NASM打印到下一行

section .text 
    global _start: 

_start: 
    ; Input variables 
    mov edx, inLen 
    mov ecx, inMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 2 
    mov ecx, num1 
    mov ebx, 0 
    mov eax, 3 
    int 0x80 

    mov edx, inLen 
    mov ecx, inMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 2 
    mov ecx, num2 
    mov ebx, 0 
    mov eax, 3 
    int 0x80 

    ; Put input values in correct registers 
    mov eax, [num1] 
    sub eax, '0' ; convert char to num 
    mov ebx, [num2] 
    sub ebx, '0' ; convert char to num 

    ; Perform addition 
    add eax, ebx 
    add eax, '0' ; convert num to char 

    ; Set sum in res 
    mov [res], eax 

    ; Output result 
    mov edx, resLen 
    mov ecx, resMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 1 
    mov ecx, res 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    ; Exit program 
    mov eax, 1 
    int 0x80 

    section .bss 
    num1 resb 2 
    num2 resb 2 
    res resb 2 

section .data 
    inMsg db "Input number: ", 0xA, 0xD 
    inLen equ $-inMsg 
    resMsg db "Result: ", 0xA, 0xD 
    resLen equ $-resMsg 

當我運行控制檯看起來是這樣的:

[email protected]:~/ASM/Addition$ ./Add 
Input number: 
3 
Input number: 
2 
Result: 
[email protected]:~/ASM/Addition$ 

我怎樣才能得到它,因此5將打印在自己的行,並沒有打印後直接cmd? I.E.它應該是這樣的:

[email protected]:~/ASM/Addition$ ./Add 
Input number: 
3 
Input number: 
2 
Result: 
5 
[email protected]:~/ASM/Addition$ 
+2

打印結果後,將字符序列'0xA,0xD'寫入標準輸出。 – Michael

+3

它是linux,只寫'0xA'。 – Jester

回答

3

你所有的信息已經,你只是不看到它:

resMsg db "Result: ", 0xA, 0xD 

你知道這是什麼意思是什麼呢?它定義作了如下字符的字符串:

Result: XY 

...其中XY實際上是不可見字符(具有數值是0xA = 10,爲0xD = 13,也被稱爲換行(LF)和滑架返回(CR)),導致輸出包裝到一個新行。由於它們的隱形性質,它們在雙引號之外被指定 - 你不能僅僅包含它們,所以你必須改寫它們的數值。

當然你可以單獨使用它們,以及:

newLineMsg db 0xA, 0xD 
newLineLen equ $-newLineMsg 

newLineLen當然會2,但我離開這裏,以保持系統一樣的,你目前使用的,爲了更容易理解。)

所以只輸出沒有任何其他文字(您想5後做什麼),一個換行符,然後你可以使用:

mov edx, newLineLen 
mov ecx, newLineMsg 
mov ebx, 1 
mov eax, 4 
int 0x80 

...就像resMsg/resLen


然而,正如小丑指出,在Linux上你也應該能夠輸出只是一個單一的換行符(是0xA)(也是從您的代碼刪除現有0xD的)。

+0

你不需要單獨的換行符。只需在'resMsg'的換行符上添加一個標籤即可。還值得指出的是,他們應該都在'.rodata'部分。 –

+1

此外,NASM(但不是YASM)將在反引號字符串內處理C風格的'\ n',因此您可以使用該字符而不是數字值進行ASCII編碼。 –

+0

@PeterCordes:我運行了下面的代碼:[](https://gist.github.com/anonymous/ecba3950faa63a4fff4d4573bbc8d0d2)。我使用nasm編譯它($ nasm -f elf Hello.asm $ ld -m elf_i386 -s -o Hello Hello.o )但是當我運行腳本時,我的控制檯看起來像這樣:tyler @ ubuntu:〜/ ASM/HellowWorld $ ./Hello Hello World \ ntyler @ ubuntu:〜/ ASM/HellowWorld $ ....我做錯了什麼,因爲它看起來像C風格不起作用? –