[英]Why do write syscalls print `%` at end on linux x86_64 (nasm)?
[英]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.