在程序集中将十进制转换为三元(基数3)

时间:2014-03-26 09:54:36

标签: assembly hex decimal nasm

我正在尝试编写一个程序,将以十六进制表示的字符串转换为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

1 个答案:

答案 0 :(得分:1)

嗯......&#34;十进制&#34;,&#34;十六进制&#34;,&#34;三元&#34;等等是在文本中表示数字的方式。您已将带有数字十六进制表示的字符串转换为数字 - 实际上没有任何内容&#34;十进制&#34;关于它在这一点上。你想把你的数字除以3,但你真的没有&#34;添加&#34;对于任何事物的余数,您将数字转换为表示该数字的字符(添加&#39; 0&#39;)并将其放入缓冲区。像往常一样,我们得到了错误的&#34;订单 - 工作&#34;倒退&#34;在缓冲区或以其他方式反转。不要忘记你想要以零终止字符串结束! printf的格式字符串需要一个字符串,而不是一个整数。如果您有一个将数字转换为十进制表示的例程,则只需将10更改为3即可。