Je cherche à produire un nombre entier en utilisant un assemblage pur. J'utilise nasm sur une machine Linux 64 bits. En ce moment je cherche un moyen de sortir des entiers pour déboguer un compilateur, mais je veux utiliser le même code pour écrire un OS, ce qui est aussi la raison pour laquelle je n'utilise pas simplement printf()
. Après beaucoup de recherche et de frustration que je suis venu avec ce codeManière plus efficace de générer un nombre entier dans un assemblage pur
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
Notez que je remplacerai 0x80 appels avec le BIOS lors du portage au développement OS.
Ma question est de savoir comment optimiser, ou même enjoliver, ce code plus loin. Ma première pensée serait de remplacer pousser tous les registres individuellement, mais il n'y a pas d'instruction 64 bits pusha
...
« * plus * optimal » ??? – tchrist
Version Hex: http://stackoverflow.com/questions/3853730/printing-hexadecimal-digits-with-assembly –