【发布时间】:2010-11-07 11:04:40
【问题描述】:
我希望使用纯汇编输出一个整数。我在 64 位 linux 机器上使用 nasm。目前我正在寻找一种输出整数的方法来调试编译器,但我想使用相同的代码来编写操作系统,这也是我不简单使用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
请注意,在移植到操作系统开发时,我将用 BIOS 调用替换 0x80 调用。
我的问题是如何进一步优化甚至美化这段代码。我的第一个想法是替换单独推送所有寄存器,但没有任何 64 位 pusha 指令...
【问题讨论】:
标签: compiler-construction performance x86-64 nasm