พิมพ์ 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 ไปที่ stdout หลังจากพิมพ์ผลลัพธ์   -  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 หรือที่เรียกว่า line feed (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) จะประมวลผล C-style \n ภายในสตริง backquoted ดังนั้นคุณจึงสามารถใช้สิ่งนั้นแทนค่าตัวเลขสำหรับการเข้ารหัส 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: Ahhh ฉันเห็นเครื่องหมายคำพูดด้านหลังไม่ใช่เครื่องหมายคำพูดซ้ำ .... ขอบคุณฉันใช้งานได้แล้ว - person Tyler; 02.05.2016