Assembly: tökéletes számok kiíratása

Assembly: tökéletes számok kiíratása
2009-04-30T13:38:54+02:00
2009-04-30T13:38:56+02:00
2022-11-13T11:35:42+01:00
Spawn
Sziasztok!!

Nagy problémám lenne. A megadott forráskodal a tökéletes számokat tudom kiíratni, de csak úgy hogy a kitevőt manuálisan a forráskódban változtatom. Nekem az kellene hogy a main-em futása úgy történjen hogy: a forráskódban megadott "kitevo"-t minden ciklusban csökkentse, az alap ne változzon és kiíratás úgy történjen hogy egymás alá kerüljenek a tökéletes számok, Tehát az ismétlés megszervezesével van problémám. Ha valaki tudna segíteni azt nagyon megköszöném, mert már ráment néhány éjszakám és nem szeretnék ez miatt elbukni...
Tehát a forráskodban:
a "kitevo" megvan adva pl:7, és annyiszor kellene lefutnia amíg "kitevo" egynelő 2, 1-re már ne nézze!! A "kitevo" melett kommentben megadott számokra kellne az outputnak kiírodnia, a többi köztes számra nem ad vissza semmit! Az utolso "kitevo" a 8 amit vizsgálni tud, mert at felett már túlcsordul.
Ennek kellene az outputnak lennie:
8128
496
28
6


; A program tartalmazza az inputot. Az input az n, mely az Euklidész által megalkotott 2n-1(2n - 1) képlet része és kitevő. ; A program feladata a tökéletes számok kiírása, melyet az említett képlettel számol ki a program. ; A számításhoz figyelembe kell vennie, hogy a képlet (2n - 1) érték prím szám e. Ha igen a számítást elvégzi, ; ha nem a következő hatványkitevővel számol tovább. .model small .stack .data ujsor db 10, 13, "$" kitevo = 5 ;2, 3, 5, 7 alap = 2 .code main PROC mov ax, word ptr [alap] mov bx, word ptr [alap] mov cx, word ptr [kitevo] dec cx negyzet: ;-------------------------------------------------------------------------------------------------------------------------------------------------- ;2 az n.-en-1 kiszámolása kezdődik mul bx loop negyzet ;2-t a n-dikre emeli és kivon egyet belső dec ax ;vége ;------------------------------------------------------------------------------------------------------------------------------------------------- ;a 2 az n.-en-1 prím-e?? ;alap: ;AX=7 GOOD mov bx, ax ;BX=AX=7 GOOD mov cx, ax ;CX=AX=7 GOOD oszto: dec bx ;BX=6 GOOD dec cx ;CX=6 GOOD push ax ;verembe AX div bl ;AX/BX xor dx, dx ;DX kinullázom mov dl, al ;az osztás eredményét AL-ből átrakom DL-be mov ax, dx ;AX-ben van az eredmény mul bl ;visszaszorzom az eredményt az osztóval szorzat AX-ben van xor dx, dx ;DX kinullázom mov dl, al ;szorzat DX-be pop ax push ax ;ax verembe sub ax, dx ;itt kapom a maradékot AX-DX=1 mov dx, ax ;maradék DX-be xor ax, ax ;AX kinullázása* pop ax ;*majd helyreállítása cmp cx, 1 jge kovetkezo cmp dx, 0 jz vege jg oszto ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kovetkezo: push ax xor ax, ax xor cx, cx mov ax, word ptr [alap] mov bx, word ptr [alap] mov cx, word ptr [kitevo] dec cx cmp cx, 0 je nulla cmp cx, 1 je egy jne negyzet_1 nulla: mov ax,1 jmp szoroz egy: mov ax, word ptr [alap] jmp szoroz negyzet_1: dec cx cikl: mul bx loop cikl szoroz: xor bx, bx pop bx ;belso mul bx jmp eleje eleje: MOV BX,10 ;oszto beallitasa XOR cx, cx kiir_osztas: OR AX,AX ;csak flageket allit, ax-et valtozatlanul hagyja JZ kiir_vege ;ha ax 0, ugras XOR DX,DX DIV BX ;eredmeny ax, maradek dx PUSH DX ;maradek le verembe, ezt fogjuk kiirni INC CX ;cx novelese, ennyi karaktert kell majd kiirni JMP kiir_osztas kiir_vege: MOV AH,02h ;int 21h paramterezese -> DL-t kiirja JCXZ kiir_nulla;ha 0 a szam kiir: POP DX ;kivesszuk a kiirando szamot ADD DL,'0' ;karaktert csinalunk belole (0 ascii kodjat adjuk hozza) INT 21h DEC CX CMP CX,0 JNE kiir ;ugras ha CX!=0 JMP kiir_ujsor kiir_nulla: MOV DL,'0' ;'0' kiirasa INT 21h kiir_ujsor: mov ax,seg ujsor mov ds,ax mov ah,09 lea dx, ujsor int 21h vege: mov ax,4c00h int 21h main ENDP end main
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd