汇编I / O和总和

时间:2014-03-25 16:45:01

标签: assembly io sum nasm

你好我需要一些关于某事的帮助,在汇编中,你输入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

1 个答案:

答案 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位)作为“文本”部分,尽管“数字”可能更大。