首页 > 解决方案 > 用于查找可整除数的 NASM Assembly x86 循环不起作用

问题描述

编辑: 感谢 Jester,我得到了循环工作,但是应该找到可整除数字的循环总是给我“1”和我正在划分的数字。我在循环内使用 div 错误吗?

编辑2:

程序按预期工作,代码如下。

%include "io.inc"
 
extern _scanf ; externa za scanf
extern _printf; externa za printf
 
global _main
 
section .bss
N resd 1 
 
section .data
vhod db "%d", 0 ; prebrano število
izhod db "%d", 10, 0 ; izpisano število
 
section .text
_main:
    mov ebp, esp; for correct debugging
pushad ; ALPR
push dword N
push dword vhod  ;; priprava za branje
call _scanf
 
add esp, 8 ; iz esp počistimo 8 bitov
mov eax, [N] ; v eax damo N za deljenje
mov ebx, 2 ; v ebx damo 2 za deljenje
sub edx, edx ; spucamo edx, da lahko dobimo pravilni ostanek pri deljenju
div ebx ; edx:eax / ebx 
mov [N], eax ; shranimo v N dejansko število iteracij
mov ebx, 0 ; exb register nastavimo na 0
.loopf: ; začetek loopa
inc ebx ; ebx šteje kot iterator, povečamo za 1 na začetku loopa.
mov eax, ebx ; pripravimo eax kot deljenca
mov esi, 9 ; pripravimo esi kot deljitelj
sub edx, edx ; spucamo edx
div esi ; delimo
cmp edx, 0 ;pogledamo če je ostanek pri deljenju 0
jne .skip ; če ni, ne izpisemo
push ebx ; ebx dodamo na sklad
push dword izhod ; priprava za izpis
call _printf ;; izpisemo
add esp, 8  ; počistimo esp
.skip:
cmp ebx, [N], ; primerjamo N in register ebx
jl .loopf ; skok na zacetek loopa, ce je manjse 
popad ; pop klic na vse registre
ret ; return

标签: loopsassemblynasmsasm

解决方案


推荐阅读