Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TITLE MASM Template (main.asm)
- INCLUDE Irvine32.inc
- .data
- dlzka equ 500
- novaSprava DB dlzka dup(?)
- riadok DB 0dh,0ah,0 ; posun o dalsí riadok vo vypísaní
- X DD 0 ; vsetky bity sú nastavené na nulu. Mnozina je prazdna
- .code
- Read PROC ; zaciatok procedury READ
- push ecx ; všetky registre použité v danej procedure musia byt push a pop , avsak okrem eax
- push edx
- push edi
- push ebx
- mov ecx, dlzka ; nastavenie parametrov pre nacitanie retazca - parameter dlzka ma hodnotu 500 - vlozime ju do registra ecx
- mov edx,OFFSET novaSprava ; nastavenie parametrov pre nacitanie retazca - offset je adresa novaSprava s dlzkou 500
- call ReadString
- mov edi,0 ; na zaciatku vynulujeme registre
- mov eax,0
- mov ebx,0
- mov bl, novaSprava[edi] ;
- cmp bl, '-'
- jne Vypis1
- inc edi
- Vypis1:
- mov bl, novaSprava[edi]
- cmp bl, 0 ; porovnavam ci je nula, ak ano idem na koniec
- je dalsi ; ak to plati, ak uz skoncil cyklus - podmieneny skok - je
- sub bl, '0' ; porovnavam ci tam nie je nula
- imul eax, 10 ; vynasobim 10
- add eax, ebx ; pripocitam do neho to co som ziskal
- inc edi
- jmp Vypis1
- dalsi:
- mov bl, novaSprava[0]
- cmp bl,'-'
- jne Koniec ;ak to nebolo minus, chod na koniec v opacnom pripade ho znegujes
- neg eax
- Koniec:
- pop ebx ; všetky pop sa inicializuju opačne ako push
- pop edi
- pop edx
- pop ecx
- ret
- Read ENDP ; koniec procedury READ
- Write PROC ; zaciatok procedury Write
- push edi ; všetky registre použité v danej procedure musia byt push a pop , avsak okrem eax
- push ecx
- push edx
- push ebx
- mov bx, 10
- mov edi, 0
- cmp ax, 0
- jnl cyklus ; ak to nie je menšie
- mov cx, ax
- mov al, '-'
- call Writechar
- mov ax, cx
- neg ax
- cyklus:
- mov dx,0 ; aby sme mali zvysok nula
- div bx
- mov novaSprava[edi], dl
- inc edi
- cmp ax, 0
- jne cyklus
- dec edi
- pokracovanie:
- mov al, novaSprava[edi]
- add al, '0'
- call WriteChar
- cmp edi,0
- je koniec
- dec edi
- jmp pokracovanie
- koniec:
- pop ebx ; všetky pop sa inicializuju opačne ako push
- pop edx
- pop ecx
- pop edi
- ret
- Write ENDP ; koniec procedury Write
- Generuj PROC USES ebx ecx eax edx paOffset
- mov ebx, paOffset
- mov ecx, 10 ; chceme vygenerovat 10 nahodnych cisel
- NahodneCislo:
- mov eax, 32 ; potrebujeme vratit cislo od <0, n-1> - n je ulozene v registri EAX - je to jeho vstupny parameter
- call RandomRange ; vrati cislo od <0, n-1>
- mov edx, 1 ; do registra edx vlozime jednotku
- push ecx ; v registri ecx je 10 nahodnych cisel (push)
- mov cl, al ; do registra cl vlozime to co je v registry al (cl potrebujeme pri operácií shl). Pretoze chceme nacitat cislo od 0 po 32. Zmesti sa do registra al
- shl edx, cl
- or [ebx], edx ; or pouzivame ked potrebujeme nastavit niektorý bit laveho operandu na 1
- pop ecx ; v registri ecx je 10 nahodnych cisel (pop)
- call Write ; cez nasu proceduru Write
- mov edx, offset riadok ; chceme ich odriadkovať
- call Writestring
- loop NahodneCislo
- ret
- Generuj ENDP
- Vypis1 PROC USES eax ecx edx paMnozina
- mov ecx, 32
- Prechod:
- mov edx, 1
- shl edx, cl
- test paMnozina, edx ; paMnozina - parameter volany hodnotou
- jnz Vypis
- loop Prechod
- jmp Koniec
- Vypis:
- mov eax, ecx
- mov edx, offset riadok ; chceme ich odriadkovať
- call Writestring
- call Write
- call crlf
- loop Prechod
- Koniec :
- ret
- Vypis1 ENDP
- main PROC
- INVOKE Generuj, offset X
- INVOKE Vypis1, X
- call waitmsg
- exit
- main ENDP
- END main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement