【问题标题】:Converting User Input Hexadecimal to Decimal in Assembly在汇编中将用户输入十六进制转换为十进制
【发布时间】:2016-08-21 00:26:24
【问题描述】:

我正在尝试创建一个汇编程序,该程序接受用户输入的不超过 4 位的十六进制数字并以 10 为基数输出相同的数字。这是在 Linux 安装上使用 NASM 完成的。使用我找到的一些教程和我对这种语言的非常有限的理解,我想出了这个。

section .data
    inp_buf: times 6 db 0
    numPrompt: db "Enter a hexadecimal value no greater than 4 digits: "
    len1 equ $ - numPrompt
    answerText: db "The decimal value is: "
    len2 equ $ - answerText

section .bss
    dec:   resb    5

section .text
    global _start
_start:
    mov edx, len1       
    mov ecx, numPrompt  
    mov ebx, 1      
    mov eax, 4      
    int 0x80

    mov eax, 3      
    mov ebx, 0      
    mov ecx, inp_buf    
    mov edx, 6      
    int 0x80

    mov esi, dec+11     
    mov byte[esi], 0xa              
    mov eax, ecx         ;I feel like the problem must be here
    mov ebx, 0xa            
    mov ecx, 1              

next:
    inc ecx                 
    xor edx, edx            
    div ebx                 
    add edx, 0x30           
    dec esi                 
    mov [esi], dl           
    cmp eax, 0              
    jnz next

    mov edx, len2           
    mov ecx, answerText     
    mov ebx, 1              
    mov eax, 4              
    int 0x80 

    mov edx, ecx            
    mov ecx, esi            
    mov ebx, 1              
    mov eax, 4              
    int 0x80            

    mov ebx, 0              
    mov eax, 1              
    int 0x80

需要注意的是,如果用户输入被忽略,而你只是在数据部分中放入一个带有十六进制的变量,程序可以毫无问题地转换它。例如,如果您有hexNum: equ 0xFFFF 行并将上面的注释行替换为mov eax, hexNum,则代码能够正确地将其转换为以10 为基数。错误必须与用户输入的格式有关,但我不知道如何验证。

感谢您对我的问题的任何见解。这是我除“hello world”之外的第一个汇编程序,其中许多新概念对我来说仍然令人困惑和难以理解。如果我有更好或更简单的方法来完成整个程序,那么我也很想听听。谢谢!

【问题讨论】:

  • 您的代码只有在已经是数字的情况下才能打印数字。您将输入作为 ascii 文本,您必须先将其转换为数字。实际上,您只是想打印输入缓冲区的地址。

标签: linux assembly x86 hex nasm


【解决方案1】:

`inp_buffer 中的值将采用十六进制格式,例如。

1234

将被存储为

0x31 0x32 0x33 0x34

4 个连续字节。

必须使用与反向转换完全相反的过程将数字从 ascii 格式转换为十六进制格式。

将数字转化为十六进制后,转换为十进制的过程是正确的,可以称为十进制的dabble。

我建议先完全转换,然后再逐字节转换成 ascii。得到最终结果然后进行转换总是更好,尤其是在调试困难的汇编语言编程中。

【讨论】:

  • 试一试,如果需要更多帮助,我可以发布我自己的代码作为参考。
猜你喜欢
  • 2014-03-19
  • 2012-06-02
  • 2019-05-16
  • 1970-01-01
  • 2015-06-02
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多