2014-06-14 31 views
-2
处理

这个代码是由用户添加两个数字输入的示例,它工作正常,如果由用户输入的号码小于10,即图5和4,但它也导致ASCII charachter如果:用数字在装配

  • 由用户大于或等于10,即6和12
  • 或输入的数字,如果的两个数字之和大于10,即5和5

什么是在问题代码如下所以它可以接受任何小数,即400 + 650

SYS_EXIT equ 1 
SYS_READ equ 3 
SYS_WRITE equ 4 

STDIN  equ 0 
STDOUT equ 1 

segment .data 

msg1 db "Enter a digit ", 0xA,0xD 
len1 equ $- msg1 

msg2 db "Please enter a second digit", 0xA,0xD 
len2 equ $- msg2 

msg3 db "The sum is: " 
len3 equ $- msg3 

segment .bss 

num1 resb 2 
num2 resb 2 
res resb 1  

section .text 
global _start ;must be declared for using gcc 
_start: ;tell linker entry point 
mov eax, SYS_WRITE   
mov ebx, STDOUT   
mov ecx, msg1   
mov edx, len1 
int 0x80     

mov eax, SYS_READ 
mov ebx, STDIN 
mov ecx, num1 
mov edx, 2 
int 0x80    

mov eax, SYS_WRITE   
mov ebx, STDOUT   
mov ecx, msg2   
mov edx, len2   
int 0x80 

mov eax, SYS_READ 
mov ebx, STDIN 
mov ecx, num2 
mov edx, 2 
int 0x80   

mov eax, SYS_WRITE   
mov ebx, STDOUT   
mov ecx, msg3   
mov edx, len3   
int 0x80 

; moving the first number to eax register and second number to ebx 
; and subtracting ascii '0' to convert it into a decimal number 
mov eax, [number1] 
sub eax, '0' 
mov ebx, [number2] 
sub ebx, '0' 

; add eax and ebx 
add eax, ebx 
; add '0' to to convert the sum from decimal to ASCII 
add eax, '0' 

; storing the sum in memory location res 
mov [res], eax 

; print the sum 
mov eax, SYS_WRITE   
mov ebx, STDOUT 
mov ecx, res   
mov edx, 1   
int 0x80 exit:  
mov eax, SYS_EXIT 
xor ebx, ebx 
int 0x80 
+0

为了使用基十数字系统获得一些ASCII值,我们在第一步中减去ASCII中的“0”,下一步我们必须将数字例子乘以十,百乘以及thousend和in最后一步我们可以将这些值一起添加到第一个值。 –

回答

0

你的程序实际上做的是:

  • 读入四个字节。
  • 从键盘输入第一个和第三个字节。如果你输入两个一位数字的数字,你将得到两位数字(因为第二个字节是“返回”键)
  • 从两个字符中减去'0'的ASCII码。如果这两个字符是数字,你会得到十进制值 - 否则你会得到垃圾
  • 添加这两个数字;然后添加'0'的ASCII码。如果总和小于10,那么结果是数字0-9的ASCII码;否则它是一些其他的ASCII码。
  • 打印出的字符

尝试增加任何数量而所述第一个的第一个(最左边的)数字是123(例如:添加12345和678)。你会看到结果总是4,因为键盘输入的第一个字符是'1',第三个字符是'3'。要输出一个> = 10的数字,你必须使用“div”指令:例如,“div cl”指令将16位(无符号)数字分成ax(低16位)的eax)除以cl(ecx的低8位)中的值,并将商(向下取整)放入al(低8位eax),剩余部分放入ah(低16位eax的高8)。