2016-04-27 133 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风格不起作用? –