在汇编

时间:2016-04-26 23:10:25

标签: linux assembly x86 hex nasm

我正在尝试创建一个程序集程序,该程序将用户输入的十六进制数不超过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”,而且很多这些新概念对我来说仍然令人困惑和难以理解。如果我有更好或更简单的方式来完成整个计划,那么我也很乐意听到这个。谢谢!

1 个答案:

答案 0 :(得分:1)

`inp_buffer中的值将以十六进制格式表示,例如。

1234

将存储为

0x31 0x32 0x33 0x34

连续4个字节。

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

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

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