Я ищу для вывода целого числа, используя чистую сборку. Я использую nasm на 64-битной Linux-машине. На данный момент я ищу способ вывода целых чисел для отладки компилятора, но я хочу использовать тот же код для написания ОС, что также является причиной того, что я просто не использую printf()
. После долгих поисков и разочарований я придумал этот код
SECTION .data
var: db " ",10,0
SECTION .text
global main
global _printc
global _printi
main:
mov rax, 90
push rax
call _printi
xor rbx, rbx
mov rax, 1
int 0x80
_printi:
pushf
push rax
push rbx
push rcx
push rdx
mov rax, [rsp+48]
mov rcx, 4
.start:
dec rcx
xor rdx, rdx
mov rbx, 10
div rbx
add rdx, 48
mov [var+rcx], dl
cmp rax, 0
jne .start
mov rax, [var]
push rax
call _printc
pop rax
pop rdx
pop rcx
pop rbx
pop rax
popf
ret
_printc:
push rax
push rbx
push rcx
push rdx
mov rax, [rsp+40]
mov [var], rax
mov rax, 4
mov rbx, 1
mov rcx, var
mov rdx, 4
int 0x80
pop rdx
pop rcx
pop rbx
pop rax
ret
Обратите внимание, что я буду заменять вызовы 0x80 вызовами BIOS при портировании в ОС.
Мой вопрос заключается в том, как оптимизировать или даже преувеличивать этот код дальше. Моя первая мысль заключалась в том, чтобы заменить нажатие всех регистров по отдельности, но не существует 64-разрядной инструкции pusha
...