Я пытаюсь написать программу, которая читает целое число и находит все делители этого целого числа (вплоть до целого числа, но не включая его).После нахождения делителя он помещается в стек, и в конце делители должны быть напечатаны в обратном порядке.
Это код, который у меня сейчас есть:
; 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.
Я думаю, что проблема возникает во время деления, так как что-то помещается в стек (хотя это не правильно).Есть идеи, где это может пойти не так?