title: Assembly input error
body: <p>I'm trying to read a number from input and then calculate it's factors(don't know if they are factors, for example 10's factors are 1,2,5,10). I believe that my calculation part is correct because when I calculate factors of value that was preset in the code it works. But when I try to input the value, I get wrong results.
  I will post code that works with pre-set value 1000 (doesn't matter what you input, it calculates 1000's factors).</p>
  
  <pre><code>; ----------------------------------------------------
  ; LeiaTegurid.asm
  ; @brief    Leiab sisestatud numbri tegurid.
  ; @author   Eerik Muuli
  
  ; @date     27.01.2014
  ; ----------------------------------------------------
  global  _main        ; make visible for linker
  extern  _printf      ; link with printf
  extern _scanf ; Kasutaja sisendi jaoks.
  extern _atoi  ;string-&gt;int
  ; -------------------------------
  section .const
    hello db `Tegur: %d \n\0`; 0 on stringi lõpp.
    otsitav dw 1000 
  ; -------------------------------  
  section .data
  s6num db `Sisesta arv: \0` ; Küsib sisendi.
  vaste db "%s", 0 ; Sisend.
  ; -------------------------------
  section .bss
  inpt resb 1000 ; Reserveerib 1000 baiti.
  ; -------------------------------
  section .text
  _main:
  push ebp  ;proloog
  mov  ebp, esp
  
  push s6num
  call _printf ; Prindib: "Sisesta arv: "
  add esp, 4
  
  push inpt
  push vaste ; Meie sisend
  call _scanf
  add esp, 8
  
  push inpt
  call _atoi ; String intiks.
  add esp, 4
  
  ; mov ecx, eax
  mov ebx,  dword[otsitav] ; Annab ebx-le kasutaja sisestatud väärtuse.
  mov [esp-4], eax ; Annab esp-4-le kasutaja sis. väärtuse.
  
  inc ebx ; Suurendab ebx-i. Vajalik tsükli jaoks.
  ;mov edx, dword[otsitav] ; Annab edx-le väärtuseks kasutaja valitud arvu.
  
  .loop1: ; Tsükkel algab.
  cmp ebx , 1 ; võrdleb, et tsüklist välja saada.
  je .end ; hüppab lõppu.
  dec ebx ; võtab eax-ilt ühe ära.
  xor edx, edx ; Nullib jäägi ära.
  
  mov eax, dword[otsitav] ; Annab eax-le otsitava väärtuse.
  idiv  ebx ; Jagab eax-i(otsitava) hetke arvuga.
  ; mov ecx, eax ; Paneb vastsuse ecx-i.
  ; Jääk on edx-is.
  
  cmp edx, 0; edx(jääk) ? 0
  jg .loop1 ; Kui jääk &gt; 0, siis läheb insta algusesse.
  push ebx ; Printimiseks.
  push hello ; Printimiseks.
  call _printf ; Kutsub printimise välja.
  add esp, 8 ; Tasakaalustab.
  jmp .loop1 ; Hüppab tsükli algusesse.
  
  .end: ; lõpp
  
  mov  esp, ebp ;epiloog, taastame registrid
  pop  ebp
  ret
  </code></pre>
  
  <p>I will now also post the version that reads the input and doesn't work.
  Note that the lines that I've changed in the new version are marked with <em>*</em></p>
  
  <pre><code>; ----------------------------------------------------
  ; LeiaTegurid.asm
  ; @brief    Leiab sisestatud numbri tegurid.
  ; @author   Eerik Muuli
  ; @date     27.01.2014
  ; ----------------------------------------------------
  global  _main        ; make visible for linker
  extern  _printf      ; link with printf
  extern _scanf ; Kasutaja sisendi jaoks.
  extern _atoi  ;string-&gt;int
  ; -------------------------------
  section .const
    hello db `Tegur: %d \n\0`; 0 on stringi lõpp.
    otsitav dw 1000 
  ; -------------------------------  
  section .data
  s6num db `Sisesta arv: \0` ; Küsib sisendi.
  vaste db "%s", 0 ; Sisend.
  ; -------------------------------
  section .bss
  inpt resb 1000 ; Reserveerib 1000 baiti.
  ; -------------------------------
  section .text
  _main:
  push ebp  ;proloog
  mov  ebp, esp
  
  push s6num
  call _printf ; Prindib: "Sisesta arv: "
  add esp, 4
  
  push inpt
  push vaste ; Meie sisend
  call _scanf
  add esp, 8
  
  push inpt
  call _atoi ; String intiks.
  add esp, 4
  
  ***mov ecx, eax***
  ***mov ebx,  ecx ; Annab ebx-le kasutaja sisestatud väärtuse.***
  mov [esp-4], eax ; Annab esp-4-le kasutaja sis. väärtuse.
  
  inc ebx ; Suurendab ebx-i. Vajalik tsükli jaoks.
  ;mov edx, dword[otsitav] ; Annab edx-le väärtuseks kasutaja valitud arvu.
  
  .loop1: ; Tsükkel algab.
  cmp ebx , 1 ; võrdleb, et tsüklist välja saada.
  je .end ; hüppab lõppu.
  dec ebx ; võtab eax-ilt ühe ära.
  xor edx, edx ; Nullib jäägi ära.
  
  ***mov eax, ecx ; Annab eax-le otsitava väärtuse.***
  idiv  ebx ; Jagab eax-i(otsitava) hetke arvuga.
  ; mov ecx, eax ; Paneb vastsuse ecx-i.
  ; Jääk on edx-is.
  
  cmp edx, 0; edx(jääk) ? 0
  jg .loop1 ; Kui jääk &gt; 0, siis läheb insta algusesse.
  push ebx ; Printimiseks.
  push hello ; Printimiseks.
  call _printf ; Kutsub printimise välja.
  add esp, 8 ; Tasakaalustab.
  jmp .loop1 ; Hüppab tsükli algusesse.
  
  .end: ; lõpp
  
  mov  esp, ebp ;epiloog, taastame registrid
  pop  ebp
  ret
  </code></pre>