使用NASM程序集将16位十进制数转换为其他基数

时间:2015-04-27 01:03:59

标签: assembly nasm

我在使用NASM程序集实现二进制,八进制和十六进制转换的正确十进制时遇到了一些问题。我有大部分代码如下,我知道有些问题我仍在努力修复。我在代码中评论了相关信息。

{{1}}

测试的当前输出16位数155: 二进制:11011001 八月:332 十六进制:119

1 个答案:

答案 0 :(得分:2)

您的代码有3个主要问题:

  • 按相反顺序显示数字
  • 它以整数形式显示十六进制数字(例如,0xB显示为11)
  • 评论非常糟糕(汇编不是高级语言)

您的代码还有其他问题:

  • 没有有效利用寄存器(将事物存储在较慢的变量中)
  • 代码重复 - 接受" base"的单个例程作为输入会使代码的大小减半
  • 滥用宏(&#34;语言中的语言&#34;);这使得理解代码变得更加困难(例如,我无法判断PutInt是函数调用还是内联代码,或者它使用/删除了哪些寄存器)并且无法正确地优化它周围的指令< / LI>

对于第一个问题,最好的方法是以相反的顺序在内存中构建一个字符串,然后打印生成的字符串。对于第二个问题,您需要停止使用PutInt - 每个数字都应转换为字符。

例如(32位80x86,NASM,未经测试):

;Convert unsigned integer to string
;
;Input
; eax = integer
; ebx = base
;
;Output
; edi = address of string
;
;Trashed
; eax,edx

    section .bss
tempString: resb 33              ;Worst case string size is 32 digits
                                 ; (for base2), plus string terminator
tempStringEnd:
    section .text

convertIntegerToString:
    mov byte [tempStringEnd-1],0 ;Store string terminator
    mov edi,tempStringEnd-2      ;edi = address to store last character

.nextDigit:
    xor edx,edx                  ;edx:eax = current value
    div ebx                      ;eax = new current value, edx = next digit
    add dl,'0'                   ;dl = character for next digit maybe
    cmp dl,'9'                   ;Is the character correct?
    jbe .gotChar                 ; yes
    add dl,'A'-'0'-10            ; no, fix it up
.gotChar:
    mov [edi],dl                 ;Store the character
    dec edi                      ;edi = address for next character
    test eax,eax                 ;Is the current value zero?
    jne .nextDigit               ; no, do the next digit

    ret                          ;Done, EDI = address of completed string