我想從輸入中讀取一個數字,然後計算它的因子(不知道它們是否是因子,例如10的因子是1,2,5,10)。我相信我的計算部分是正確的,因爲當我計算代碼中預設的價值因子時,它的工作原理。但是當我嘗試輸入值時,我得到錯誤的結果。 我將發佈代碼與預設值1000一起工作(輸入無關緊要,它會計算1000年的因素)。程序集輸入錯誤
; ----------------------------------------------------
; 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->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 > 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
我現在還會發布讀取輸入並且不起作用的版本。 請注意,我在新版本中已經更改的行標有*
; ----------------------------------------------------
; 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->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 > 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