【发布时间】: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