你好我需要一些关于某事的帮助,在汇编中,你输入ecx寄存器的数字是ascii或decimal的形式。并且我想说我想添加两个或更多数字输入数字,我必须将输入更改为十进制右边
section .data
msg db "Enter your numbers", 0xA,0xD
len equ $-msg
size dd "0: "
lens equ $-size
section .bss
num resd 3
sum resd 3
section .text
global _start
_start:
;print msg
mov eax,4
mov ebx,1
mov ecx, msg
mov edx, len
int 0X80
;start loop
top:
;print out at what input you have reached
mov eax,4
mov ebx,1
mov ecx,size
mov edx,lens
int 0X80
;enter a number in num
mov eax,3
mov ebx,1
mov ecx,num
mov edx,3
int 0X80
;print out the number you have entered in num
mov eax, 4
mov ebx,1
mov ecx,num
mov edx,3
int 0X80
mov eax, [num]
add eax, 0
mov ebx, [sum]
add ebx, 0
add ebx, eax
add ebx, "0"
mov [sum], ebx
mov eax, 4
mov ebx, 1
mov ecx, [sum]
mov edx, 3
int 0X80
;increment the input
mov eax, [size]
add eax, 1
mov [size],eax
cmp eax, "9: "
jle top
mov eax,1
int 0X80
答案 0 :(得分:0)
sys_read
没有将任何内容“放入ecx
注册表中”。它将文本放入ecx
指向的缓冲区。它是ascii文本,是的。包含结束输入的“输入”键(换行符= 10十进制= 0Ah)(因此您只有两位数的空间)。鉴于行为良好的用户,我们可能希望它是十进制数的ascii表示。可能是十六进制数的表示......或者可能根本不是数字 - 取决于用户输入的内容。
要对此进行算术运算,您必须将其转换为数字。计算机碰巧将其存储为二进制,但将其视为“数字”。 “十进制”,“十六进制”等是表示数字的方式,但它是相同的数字(换行,例如10或0Ah)。如果用户输入“42”,假设我们的意思是小数,那就是4 * 10 + 2,对吗?字符'4'不是数字4,但可以通过减去'0'(48位小数或30小时 - 而不是数字0!)进行转换。不要尝试转换换行符,它不是我们号码的一部分。
计算完成后,您必须先将数字转换回文本才能打印出来(可能是数字的十进制表示 - 但您可以将结果打印为十六进制...或八进制或二进制或其他内容)。
这是关于所有时间最常见的问题,因此您应该能够找到示例。
你做得很好,直到add eax, 0
,它没有做任何事情(除了设置标志)。您可能希望使用单个字符(一个字节或8位)作为“文本”部分,尽管“数字”可能更大。