Nasm 打印到下一行

Tyl*_*ert 3 linux x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

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

tyler@ubuntu:~/ASM/Addition$ ./Add 
Input number: 
3
Input number: 
2
Result: 
5tyler@ubuntu:~/ASM/Addition$ 
Run Code Online (Sandbox Code Playgroud)

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

tyler@ubuntu:~/ASM/Addition$ ./Add 
Input number: 
3
Input number: 
2
Result: 
5
tyler@ubuntu:~/ASM/Addition$ 
Run Code Online (Sandbox Code Playgroud)

Che*_*yDT 7

您已经拥有所有信息,只是还没有看到:

resMsg db "Result: ", 0xA, 0xD
Run Code Online (Sandbox Code Playgroud)

你知道这到底是什么意思吗?它定义了一个由以下字符组成的字符串:

Result: XY
Run Code Online (Sandbox Code Playgroud)

... whereXY实际上是不可见字符(数值 0xA=10 和 0xD=13,也称为换行 (LF) 和回车 (CR)),它们会导致输出换行到新行。由于它们的不可见性,它们被指定在双引号之外 - 你不能只将它们包含在那里,所以你必须写下它们的数值。

当然,您也可以单独使用它们:

newLineMsg db 0xA, 0xD
newLineLen equ $-newLineMsg
Run Code Online (Sandbox Code Playgroud)

newLineLen当然是 2,但我把它留在这里是为了使系统与您当前使用的系统相同,以便于理解。)

所以只输出一个没有任何其他文本的换行符(你想在 之后做什么5),你可以使用:

mov edx, newLineLen
mov ecx, newLineMsg
mov ebx, 1
mov eax, 4
int 0x80
Run Code Online (Sandbox Code Playgroud)

...就像resMsg/ resLen


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