簡體   English   中英

如何在 ASM 中打印出兩位數整數,( Linux NASM x86_64 )

[英]How do I print out two-digit integers in ASM, ( Linux NASM x86_64 )

這是打印數字的方法,但是如何打印 2 位數字呢?

section .data
    num: db 9,10

section .text
global _start
_start:
    mov rax,[num]
    add rax,48
    mov [num],al
    mov rax,1
    mov rdi,1
    mov rsi,num
    mov rdx,2
    syscall

    mov rax,60
    mov rdi,0
    syscall

這只是打印出 9,但如果我將 num 設為 12,它會給我一個“<”。 我相信它正在打印出 60 的 ascii 字符,即“<”。

 mov rax,[num]

因為num只包含一個byte ,所以最好不要把它當作一個 qword 來讀。 使用movzx eax, byte [num]指令。 您不需要movzx rax, byte [num]指令,因為所有寫入雙字寄存器的操作都已經將高位雙字歸零。

但如何打印出 2 位數字?

下一個代碼可以做到這一點,打印 [10,99] 范圍內的數字。
請注意,換行符前面有一個占位符。

section .data
    num: db 12, 0, 10

section .text
global _start
_start:
    movzx eax, byte [num]  ; Value LT 100
    xor   edx, edx
    mov   ebx, 10
    div   ebx              ; Quotient in EAX, Remainder in EDX
    mov   ah, dl
    add   ax, '00'         ; Convert to ASCII
    mov   [num], ax        ; Stores 'tens' followed by 'ones'
    mov   rax, 1
    mov   rdi, 1
    mov   rsi, num
    mov   rdx, 3           ; 3 instead of 2
    syscall

對於一般方法,您可以先研究Displaying numbers with DOS 它解釋了方法,但是您當然需要將代碼調整為 64 位。
更好的信息位於https://stackoverflow.com/a/46301894

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM