在 x86-64 Linux 系统的 NASM 上使用系统调用坚持编写打印函数以将二进制转换并打印为十进制
Stuck on writing a print function to convert and print binary to decimal with syscalls on NASM for x86-64 Linux system
我对 NASM 上 x86-64 Linux 系统的汇编代码还很陌生,我正在尝试编写一个程序,将存储在 rdi 中的数字转换为十进制,以便它可以被打印。我不确定如何编写一个适当的函数,该函数将在使用余数作为数字的循环中除以 10,例如:存储在 rdi 中的数字 165 将重复除以 165/10,余数为 5,等等。数字输出看起来像是 0000000165。任何反馈将不胜感激!
这是我的尝试:
section .data
BUFLEN: equ 25
buf: times BUFLEN db 0
section .text
global _start
_start:
mov rsi, 1
mov rdi, 453265682
call printnum
mov rax, 60
mov rdi, 0
syscall
printnum:
mov r10, 10
convert:
mov rdx, 0
mov rax, rdi
div r10
add r15, rdx
cmp rax, 1
jnle convert
mov rax, 1 ; = 1
mov rdi, 1 ; = 1
mov rsi, buf ; add of buffer to print
mov rdx, BUFLEN ; num of bytes to write
syscall
ret
您的代码中有太多我想要更改的部分,但这里有一个最小的修复程序,只是为了让您的代码正常工作。
低于
mov r10, 10
添加
mov r15, 9
擦除
add r15, rdx
cmp rax, 1
jnle convert
并将其更改为
mov rdi, rax
add rdx, '0'
mov [r15 + buf], dl
dec r15
jns convert
这是修复后的完整 printnum
功能。
printnum:
mov r10, 10
mov r15, 9
convert:
mov rdx, 0
mov rax, rdi
div r10
mov rdi, rax
add rdx, '0'
mov [r15 + buf], dl
dec r15
jns convert
mov rax, 1
mov rdi, 1
mov rsi, buf
mov rdx, BUFLEN
syscall
ret
由您来思考为什么这行得通而您的行不通。
我对 NASM 上 x86-64 Linux 系统的汇编代码还很陌生,我正在尝试编写一个程序,将存储在 rdi 中的数字转换为十进制,以便它可以被打印。我不确定如何编写一个适当的函数,该函数将在使用余数作为数字的循环中除以 10,例如:存储在 rdi 中的数字 165 将重复除以 165/10,余数为 5,等等。数字输出看起来像是 0000000165。任何反馈将不胜感激! 这是我的尝试:
section .data
BUFLEN: equ 25
buf: times BUFLEN db 0
section .text
global _start
_start:
mov rsi, 1
mov rdi, 453265682
call printnum
mov rax, 60
mov rdi, 0
syscall
printnum:
mov r10, 10
convert:
mov rdx, 0
mov rax, rdi
div r10
add r15, rdx
cmp rax, 1
jnle convert
mov rax, 1 ; = 1
mov rdi, 1 ; = 1
mov rsi, buf ; add of buffer to print
mov rdx, BUFLEN ; num of bytes to write
syscall
ret
您的代码中有太多我想要更改的部分,但这里有一个最小的修复程序,只是为了让您的代码正常工作。
低于
mov r10, 10
添加
mov r15, 9
擦除
add r15, rdx
cmp rax, 1
jnle convert
并将其更改为
mov rdi, rax
add rdx, '0'
mov [r15 + buf], dl
dec r15
jns convert
这是修复后的完整 printnum
功能。
printnum:
mov r10, 10
mov r15, 9
convert:
mov rdx, 0
mov rax, rdi
div r10
mov rdi, rax
add rdx, '0'
mov [r15 + buf], dl
dec r15
jns convert
mov rax, 1
mov rdi, 1
mov rsi, buf
mov rdx, BUFLEN
syscall
ret
由您来思考为什么这行得通而您的行不通。