2016-04-26 28 views
0
爲十進制

我試圖創建的組件程序,它不超過4位大的用戶輸入的十六進制數,並輸出相同數量的以10爲底數這是正在使用NASM在Linux安裝完成。使用我發現的一些教程和我對這種語言的非常有限的理解,我已經想出了這個。轉換用戶輸入十六進制在大會

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」之外,很多這些新概念仍然讓我感到困惑和難以理解。如果我有更好或更簡單的方式來完成整個程序,那麼我也很樂意聽到這個消息。謝謝!

+0

您的代碼只能打印一個數字,如果它已經是一個數字。你輸入ascii文本,你必須先轉換成數字。實際上,你只是試圖打印輸入緩衝區的地址。 – Jester

回答

1

在`inp_buffer的值要在十六進制格式,如。

1234 

將被存儲爲

0x31 0x32 0x33 0x34 

在連續的4個字節。

數必須從ASCII格式使用用於反向轉換正好相反過程被轉換成十六進制格式。

得到數爲十六進制形式後,轉換爲十進制的做法是正確的,什麼可以被稱爲十進制涉獵。

我建議完全轉化第一,然後逐字節轉換成ASCII碼。獲得最終結果總是更好,然後進行轉換,特別是在調試困難的彙編語言編程中。

+0

試試看,如果需要更多幫助我可以發佈我自己的代碼作爲參考。 – sulimo