Nasm打印到下一行

时间:2016-04-27 05:48:05

标签: linux assembly x86 nasm

我在nasm Assembly中编写了以下程序:

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

当我运行它时,控制台看起来像这样:

tyler@ubuntu:~/ASM/Addition$ ./Add 
Input number: 
3
Input number: 
2
Result: 
5tyler@ubuntu:~/ASM/Addition$ 

我怎样才能得到它以便5将在自己的行上打印而不是在它之后直接打印cmd? I.E.它应该是这样的:

tyler@ubuntu:~/ASM/Addition$ ./Add 
Input number: 
3
Input number: 
2
Result: 
5
tyler@ubuntu:~/ASM/Addition$ 

1 个答案:

答案 0 :(得分:4)

您已经拥有所有信息,但您还没有看到它:

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一样。

但是,正如Jester所指出的那样,在Linux上,您还应该只能输出一个换行符(0xA)(并且还会从代码中删除现有的0xD)。