首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NASM程序集将16位十进制数转换为其他基

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

Stack Overflow用户
提问于 2015-04-27 01:03:59
回答 1查看 2.3K关注 0票数 3

我有一些问题,实现一个正确的十进制到二进制,八进制和十六进制转换使用NASM程序集。我有大部分代码如下所示,我知道这些代码存在一些问题,我仍在努力解决这些问题。我已经在代码中评论了相关信息。

代码语言:javascript
复制
    %include "io.mac"
    .STACK 100H
    .DATA
    msg1        db "Please enter a positive integer (max 16 bits): ",0
    msg2        db "The binary (base-2) representation of the number is: ",0
    msg3        db "The octal (base-8) representation of the number is: ",0
    msg4        db "The hex (base-16) representation of the number is: ",0
    msg5        db "A",0 ;These will be implemented when I get the 
    msg6        db "B",0 ;hexadecimal loop working to change 10, 11, 
    msg7        db "C",0 ;etc. to their hex equivalents.
    msg8        db "D",0
    msg9        db "E",0
    msg10       db "F",0

    .UDATA
    num1            resw 1
    quotient        resw 1
    remainder       resw 1

    .CODE
    .STARTUP
    PutStr msg1
    nwln
    GetInt [num1]

    nwln
    PutStr msg2
    nwln
    mov AX, [num1]      
    sub BH, BH

    binary_loop:
    push AX 
    mov BH, byte 2 
    div BH ;All loops output the remainders in reverse order at the moment.
    mov [remainder], AH ;I was thinking of maybe moving the remainder value
    PutInt [remainder] ;to a stack then calling it at the end of the loop,
    mov [quotient], AL ;when the quotient value is zero. However,  
    mov AX, [quotient] ;I do not know enough to make that work. Any help
    cmp [quotient], byte 0 ;would be greatly appreciated
    jz binary_done ;Could also be je, as both do the same thing
    loop binary_loop

    binary_done:
    nwln
    PutStr msg3
    nwln
    mov AX, [num1]
    sub BH, BH      

    octal_loop:     
    push AX
    mov BH, byte 8
    div BH
    mov [remainder], AH
    PutInt [remainder]
    mov [quotient], AL
    mov AX, [quotient]
    cmp [quotient], byte 0
    jz octal_done
    loop octal_loop

    octal_done:
    nwln
    PutStr msg4
    nwln
    mov AX, [num1]      
    sub BH, BH  

    hex_loop:
    push AX
    mov BH, byte 16
    div BH
    mov [remainder], AH
    PutInt [remainder]
    mov [quotient], AL
    mov AX, [quotient]
    cmp [quotient], byte 0
    jz done
    loop hex_loop

    done:
    .EXIT

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

EN

回答 1

Stack Overflow用户

发布于 2015-04-27 04:43:14

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

  • 它以相反的顺序显示数字。
  • 它将十六进制数字显示为整数(例如,0xB显示为11)。
  • 注释非常糟糕(程序集不是一种高级语言)

您的代码还存在其他问题:

  • 没有有效地使用寄存器(将东西存储在较慢的变量中)
  • 代码复制--接受“基”作为输入的单个例程将代码的大小减半。
  • 滥用宏(“语言中的语言”);这使得理解代码变得更加困难(例如,我无法判断PutInt是函数调用还是内联代码,还是注册它使用/垃圾),使得无法正确地优化围绕它的指令。

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

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

代码语言:javascript
复制
;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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29885580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档