Программа сборки, чтобы найти все делители целого числа - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь написать программу, которая читает целое число и находит все делители этого целого числа (вплоть до целого числа, но не включая его).После нахождения делителя он помещается в стек, и в конце делители должны быть напечатаны в обратном порядке.

Это код, который у меня сейчас есть:

; global and external declarations

global _main
extern  read_int, print_int, print_string
extern  read_char, print_char, print_nl

segment .data
prompt01 db 10, "Enter an integer: ",0
out01 db "Divisors: ",0

segment .bss
a resd 1

segment .text

_main:

enter   0,0 ; setup routine
pusha

; prompt for number
mov eax, prompt01   ; prompt for a
call print_string

call read_int       ; input a
mov [a], eax        ; move from eax to a
xor ecx, ecx        ; zero out ecx register


; do the division
mov ebx, 1      ; divisor in ebx
L1: mov eax, [a]        ; dividend in eax
cdq         ; sign extend eax to edx:eax pair
div ebx         ; divide - quotient in eax, remainder in edx
; if edx is 0, push on stack
cmp edx, 0
je L2
jmp L3
 ; if remainder was zero, push on to stack
L2: push edx
inc ecx         ; increment counter loop
L3: inc ebx         ; increment divisor
cmp ebx, eax        ; check if ebx = eax
je out
jmp L1

; print out everything in the stack
out:    mov eax, out01
call print_string

jcxz done
L4: pop edx
call print_int
call print_nl
loop L4

done:   popa        ; return routine
mov eax, 0
leave
ret

Ожидаемый результатчто-то похожее на это:

Enter an integer: 210
Divisors:
105
70
42
35
30
21
15
14
10
7
6
5
3
2
1

Но на самом деле я получаю это:

Enter an integer: 210
Divisors: 4210712
4210712
4210712
4210712
4210712
4210712
4210712
4210712

Поскольку в Intel 80x86 есть операция деления, я использую DIV для деления своих чисел и используюкоманда CDQ для подписи расширяет eax на пару edx: eax.

Я думаю, что проблема возникает во время деления, так как что-то помещается в стек (хотя это не правильно).Есть идеи, где это может пойти не так?

...