Ну, это не NASM, это газ, но следующий код работает для меня в Linux. Возможно, вы или какой-нибудь дружелюбный stackoverflower можете translate it into NASM.
Компиляция на Linux с gcc -nostdlib -g -o filename filename.s
.
Вы можете изменить 255 и 7 на нужный дивиденд и базу.
Если вы не используете Linux/Unix, системные вызовы вряд ли сработают.
algorithm довольно прост.
.data
base10:
.byte 255
newbase:
.byte 7
result:
.byte 0,0,0,0,0,0,0,0 # since dividend <=255 and divisor >=2
# 8 digits in the new base is enough
newline:
.byte 10
.text
.global _start
_start:
movl $result, %edi # offset in result string
xorw %ax, %ax
movb base10, %al # at start, current remainder = whole value
movb newbase, %bl
loop:
divb %bl # divide current remainder by new base
movb %ah, (%edi)
cmpb $0, %al # is the quotient zero?
je printchar # if it is we are done
xorb %ah, %ah
incl %edi # move offset in result string (note
jmp loop # digits of answer are stored in reverse
# order)
printchar:
addl $48, (%edi) # add ascii '0' to digit to get printable char
movl $4, %eax # linux sys_write
movl $1, %ebx # stdout
movl %edi, %ecx # point to current digit
movl $1, %edx # one char to print
int $0x80 # syscall
decl %edi # point to next digit
cmpl $result, %edi # are we past the final digit?
jge printchar # if we aren't keep going
# print a newline
movl $4, %eax
movl $1, %ebx
movl $newline, %ecx
movl $1, %edx
int $0x80
# finish nicely
movl $0, %ebx
movl $1, %eax
int $0x80
Это элементарная математика. Разделите базу в цикле и запишите остатки в обратном порядке. – Jester