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 сразу после него? т.е. это должно выглядеть так:

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

person Tyler    schedule 27.04.2016    source источник
comment
Запишите последовательность символов 0xA, 0xD в стандартный вывод после печати результата.   -  person Michael    schedule 27.04.2016
comment
Это Linux, просто напишите 0xA.   -  person Jester    schedule 27.04.2016


Ответы (1)


У вас уже есть вся информация, просто вы ее еще не видите:

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

Вы точно знаете, что это означает? Он определяет строку, состоящую из следующих символов:

Result: XY

... где X и Y на самом деле являются невидимыми символами (с числовыми значениями 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 из вашего кода).

person CherryDT    schedule 27.04.2016
comment
Вам не нужна отдельная новая строка. Просто поместите метку на новую строку в resMsg. Также стоит отметить, что все они должны находиться в разделе .rodata. - person Peter Cordes; 27.04.2016
comment
Кроме того, NASM (но не YASM) будет обрабатывать \n в стиле C внутри строк с обратными кавычками, поэтому вы можете использовать это вместо числовых значений для кодировки ASCII. - person Peter Cordes; 27.04.2016
comment
@PeterCordes: я запустил следующий код: [](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-style не работает? - person Tyler; 02.05.2016
comment
@TylerHilbert: Вы, вероятно, поместили строковую константу в двойные кавычки вместо обратных кавычек. nasm.us/doc. - person Peter Cordes; 02.05.2016
comment
@PeterCordes: я обновил строку до двойных кавычек (msg db Hello World\n), но моя консоль по-прежнему не публикует новую строку. - person Tyler; 02.05.2016
comment
@TylerHilbert: и в этом проблема. db "Hello World", 0xA, 0x0 работает, как и db `Hello World\n`, 0 только в NASM (не в YASM). Простое использование числового значения новой строки ASCII может быть понятнее на данный момент. - person Peter Cordes; 02.05.2016
comment
@PeterCordes: Аааа, я вижу обратные кавычки, а не двойные кавычки.... Спасибо, теперь все работает. - person Tyler; 02.05.2016