我試圖創建的組件程序,它不超過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」之外,很多這些新概念仍然讓我感到困惑和難以理解。如果我有更好或更簡單的方式來完成整個程序,那麼我也很樂意聽到這個消息。謝謝!
您的代碼只能打印一個數字,如果它已經是一個數字。你輸入ascii文本,你必須先轉換成數字。實際上,你只是試圖打印輸入緩衝區的地址。 – Jester