Nasm cetak ke baris berikutnya

Saya memiliki program berikut yang ditulis di Majelis 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

Ketika saya menjalankannya, konsolnya terlihat seperti ini:

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

Bagaimana saya bisa mendapatkannya sehingga 5 akan mencetak pada barisnya sendiri dan cmd tidak langsung mencetak setelahnya? YAITU. seharusnya terlihat seperti ini:

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

person Tyler    schedule 27.04.2016    source sumber
comment
Tulis urutan karakter 0xA, 0xD ke stdout setelah mencetak hasilnya.   -  person Michael    schedule 27.04.2016
comment
Itu linux, tulis saja 0xA.   -  person Jester    schedule 27.04.2016


Jawaban (1)


Anda sudah memiliki semua infonya, hanya saja Anda belum melihatnya:

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

Tahukah Anda apa sebenarnya maksudnya? Ini mendefinisikan string yang terbuat dari karakter berikut:

Result: XY

...di mana X dan Y sebenarnya adalah karakter yang tidak terlihat (dengan nilai numerik 0xA=10 dan 0xD=13, juga dikenal sebagai line feed (LF) dan carriage return (CR)) yang menyebabkan output digabungkan ke baris baru. Mereka ditentukan di luar tanda kutip ganda karena sifatnya yang tidak terlihat - Anda tidak bisa hanya memasukkannya ke sana sehingga Anda harus menuliskan nilai numeriknya.

Namun tentu saja Anda juga bisa menggunakannya sendiri:

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

(newLineLen tentu saja akan menjadi 2 tetapi saya meninggalkannya di sini agar sistem tetap sama seperti yang Anda gunakan saat ini, untuk memudahkan pemahaman.)

Jadi untuk hanya menampilkan jeda baris tanpa teks lain (apa yang ingin Anda lakukan setelah 5), Anda dapat menggunakan:

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

...sama seperti resMsg/resLen.


Namun, seperti yang ditunjukkan Jester, di Linux Anda juga harus dapat mengeluarkan hanya satu baris feed (0xA) (dan juga menghapus 0xD yang ada dari kode Anda).

person CherryDT    schedule 27.04.2016
comment
Anda tidak memerlukan baris baru yang terpisah. Cukup beri label pada baris baru di resMsg. Perlu juga diperhatikan bahwa semuanya harus ada di bagian .rodata. - person Peter Cordes; 27.04.2016
comment
Selain itu, NASM (tetapi bukan YASM) akan memproses \n gaya C di dalam string yang diberi tanda kutip balik, sehingga Anda dapat menggunakannya sebagai pengganti nilai numerik untuk pengkodean ASCII. - person Peter Cordes; 27.04.2016
comment
@PeterCordes: Saya menjalankan kode berikut: [](gist.github.com/anonymous/ecba3950faa63a4fff4d4573bbc8d0d2). Saya mengkompilasinya menggunakan nasm ($nasm -f elf Hello.asm $ld -m elf_i386 -s -o Hello Hello.o ) tetapi ketika saya menjalankan skrip, konsol saya terlihat seperti ini: tyler@ubuntu:~/ASM/HellowWorld$ ./Hello Hello World\ntyler@ubuntu:~/ASM/HellowWorld$.... Apakah saya melakukan kesalahan karena sepertinya c-style tidak berfungsi? - person Tyler; 02.05.2016
comment
@TylerHilbert: Anda mungkin menempatkan konstanta string dalam tanda kutip ganda, bukan tanda kutip belakang. nasm.us/doc. - person Peter Cordes; 02.05.2016
comment
@PeterCordes: Saya memperbarui string menjadi tanda kutip ganda (msg db Hello World\n), namun konsol saya masih tidak memposting baris baru. - person Tyler; 02.05.2016
comment
@TylerHilbert: dan itulah masalahnya. db "Hello World", 0xA, 0x0 berfungsi, begitu pula db `Hello World\n`, 0 hanya di NASM (bukan YASM). Hanya menggunakan nilai numerik dari baris baru ASCII mungkin lebih jelas pada saat ini. - person Peter Cordes; 02.05.2016
comment
@PeterCordes: Ahhh saya melihat tanda kutip belakang bukan tanda kutip ganda.... Terima kasih, saya berhasil sekarang. - person Tyler; 02.05.2016