我正在尝试编写一个程序,将以十六进制表示的字符串转换为trenary(base 3)表示中的字符串。到目前为止,我已成功将输入字符串转换为十进制,但现在我需要将其转换为trenary,我真的不知道如何在汇编(nasm)中编写它。 我所知道的是,我需要将十进制数除以3并将提醒添加到最终答案中。
到目前为止这是代码:
section .rodata
LC0:
DB "The result is: %d", 10, 0 ; Format string
section .bss
LC1:
RESB 32
section .text
align 16
global my_func
extern printf
my_func:
push ebp
mov ebp, esp ; Entry code - set up ebp and esp
pusha ; Save registers
mov ecx, dword [ebp+8] ; Get argument (pointer to string)
; Your code should be here...
mov dword [LC1], 0 ; initialize answer
loop:
mov al, byte [ecx]
; if al == \n, skip it
cmp al, 10
je next
shl dword[LC1], 4 ; multiply by 16 each digit we add
; if al >= 'a'
cmp al, 'a'
jge ge_a
; if al >= 'A'
cmp al, 'A'
jge ge_A
; if al >= '0'
cmp al, '0'
jge ge_0
; default
; do nothing
jmp next
ge_a: ; a <= al
; if al <= 'f'
cmp al, 'f'
jle a_f
; else
jmp next
ge_A: ; A <= al
; if al <= 'F'
cmp al, 'F'
jle A_F
; else
jmp next
ge_0: ; 0 <= al
; if al <= '9'
cmp al, '9'
jle n0_9
; else
jmp next
a_f: ; [a, f]
sub al, 'a'
add al, 10
add byte[LC1], al
jmp next
A_F: ; [A, F]
sub al, 'A'
add al, 10
add byte[LC1], al
jmp next
n0_9: ; [0, 9]
sub al, '0'
add byte[LC1], al
jmp next
next:
inc ecx ; increment pointer
cmp byte [ecx], 0 ; check if byte pointed to is zero
jnz loop ; keep looping until it is null terminated
push dword[LC1] ; Call printf with 2 arguments: pointer to str
push LC0 ; and pointer to format string.
call printf
add esp, 8 ; Clean up stack after call
popa ; Restore registers
mov esp, ebp ; Function exit code
pop ebp
ret
答案 0 :(得分:1)
嗯......&#34;十进制&#34;,&#34;十六进制&#34;,&#34;三元&#34;等等是在文本中表示数字的方式。您已将带有数字十六进制表示的字符串转换为数字 - 实际上没有任何内容&#34;十进制&#34;关于它在这一点上。你想把你的数字除以3,但你真的没有&#34;添加&#34;对于任何事物的余数,您将数字转换为表示该数字的字符(添加&#39; 0&#39;)并将其放入缓冲区。像往常一样,我们得到了错误的&#34;订单 - 工作&#34;倒退&#34;在缓冲区或以其他方式反转。不要忘记你想要以零终止字符串结束! printf的格式字符串需要一个字符串,而不是一个整数。如果您有一个将数字转换为十进制表示的例程,则只需将10更改为3即可。