处理汇编中的数字

时间:2014-06-14 00:04:40

标签: assembly x86 nasm

此代码是添加用户输入的两个数字的示例,如果用户输入的数字小于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

1 个答案:

答案 0 :(得分:0)

你的程序实际上做的是:

  • 读入四个字节。
  • 从键盘输入第一个和第三个字节。如果您输入两位一位数字,您将拥有两位数(因为第二个字节是"返回"键)
  • 减去' 0'的ASCII码来自两个角色。如果这两个字符是数字,那么您将获得小数值 - 否则您将获得垃圾
  • 添加两个数字;然后添加' 0'的ASCII码。如果总和小于10,则结果是数字0-9的ASCII码;否则它是其他一些ASCII码。
  • 打印角色

尝试添加任意数字,而第一个(最左边)的数字是123(例如:添加12345和678)。您会看到结果始终为4,因为键盘输入的第一个字符是' 1'第三个是' 3'。

要输出数字> = 10,您必须使用" div"指令:" div cl"指令 - 例如 - 将ax中的16位(无符号)数字(eax的低16位)除以cl中的值(ecx的低8位)并将商(向下舍入)放入al(低) 8位eax),其余为ah(高16位的eax中的高8位)。