Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. TITLE MASM Template                     (main.asm)
  2.  
  3. INCLUDE Irvine32.inc
  4. .data
  5.  
  6. dlzka equ 500
  7. novaSprava DB dlzka dup(?)
  8. riadok DB 0dh,0ah,0 ; posun o dalsí riadok vo vypísaní
  9. X DD 0 ; vsetky bity sú nastavené na nulu. Mnozina je prazdna
  10.  
  11. .code
  12.  
  13.  
  14. Read PROC ; zaciatok procedury READ
  15.     push ecx ; všetky registre použité v danej procedure musia byt push a pop , avsak okrem eax
  16.     push edx
  17.     push edi
  18.     push ebx
  19.  
  20.     mov ecx, dlzka ; nastavenie parametrov pre nacitanie retazca  - parameter dlzka ma hodnotu 500 - vlozime ju do registra ecx
  21.     mov  edx,OFFSET novaSprava ; nastavenie parametrov pre nacitanie retazca - offset je adresa novaSprava s dlzkou 500
  22.     call ReadString
  23.     mov edi,0 ; na zaciatku vynulujeme registre
  24.     mov eax,0
  25.     mov ebx,0
  26.     mov bl, novaSprava[edi] ;
  27.     cmp bl, '-'
  28.     jne Vypis1
  29.     inc edi
  30.  
  31.    
  32.     Vypis1:
  33.     mov bl, novaSprava[edi]
  34.     cmp bl, 0 ; porovnavam ci je nula, ak ano idem na koniec
  35.     je dalsi ; ak to plati, ak uz skoncil cyklus - podmieneny skok - je  
  36.     sub bl, '0' ; porovnavam ci tam nie je nula
  37.     imul eax, 10 ; vynasobim 10
  38.     add eax, ebx ; pripocitam do neho to co som ziskal
  39.     inc edi
  40.     jmp Vypis1
  41.  
  42.     dalsi:
  43.     mov bl, novaSprava[0]
  44.     cmp bl,'-'
  45.     jne Koniec ;ak to nebolo minus, chod na koniec v opacnom pripade ho znegujes
  46.     neg eax
  47.     Koniec:
  48.     pop ebx ; všetky pop sa inicializuju opačne ako push
  49.     pop edi
  50.     pop edx
  51.     pop ecx
  52.     ret
  53.  
  54.     Read ENDP ; koniec procedury READ
  55.  
  56. Write PROC ; zaciatok procedury Write
  57.    
  58.  
  59.     push edi ; všetky registre použité v danej procedure musia byt push a pop , avsak okrem eax
  60.     push ecx
  61.     push edx
  62.     push ebx
  63.     mov bx, 10
  64.     mov edi, 0
  65.     cmp ax, 0
  66.     jnl cyklus ; ak to nie je menšie
  67.    
  68.    
  69.  
  70.     mov cx, ax
  71.     mov al, '-'
  72.     call Writechar
  73.     mov ax, cx
  74.     neg ax
  75.    
  76.    
  77.  
  78.     cyklus:
  79.         mov dx,0 ; aby sme mali zvysok nula
  80.         div bx
  81.         mov novaSprava[edi], dl
  82.         inc edi
  83.         cmp ax, 0
  84.         jne cyklus
  85.         dec edi
  86.     pokracovanie:
  87.         mov al, novaSprava[edi]
  88.         add al, '0'
  89.         call WriteChar
  90.         cmp edi,0
  91.         je koniec
  92.         dec edi
  93.         jmp pokracovanie
  94.  
  95.         koniec:
  96.        
  97.         pop ebx ; všetky pop sa inicializuju opačne ako push
  98.         pop edx
  99.         pop ecx
  100.         pop edi
  101.        
  102.         ret
  103.  
  104.         Write ENDP ; koniec procedury Write
  105.  
  106.         Generuj PROC USES ebx ecx eax edx paOffset
  107.         mov ebx, paOffset
  108.        
  109.  
  110.         mov ecx, 10 ; chceme vygenerovat 10 nahodnych cisel
  111.         NahodneCislo:
  112.     mov eax, 32 ; potrebujeme vratit cislo od <0, n-1> - n je ulozene v registri EAX - je to jeho vstupny parameter
  113.     call RandomRange ; vrati cislo od <0, n-1>
  114.  
  115.     mov edx, 1 ; do registra edx vlozime jednotku
  116.     push ecx ; v registri ecx je 10 nahodnych cisel (push)
  117.     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
  118.     shl edx, cl
  119.     or [ebx], edx ; or pouzivame ked potrebujeme nastavit niektorý bit laveho operandu na 1
  120.     pop ecx ; v registri ecx je 10 nahodnych cisel (pop)
  121.     call Write ; cez nasu proceduru Write
  122.     mov edx, offset riadok ; chceme ich odriadkovať
  123.     call Writestring
  124.    
  125.     loop NahodneCislo
  126.     ret
  127.        
  128.         Generuj ENDP
  129.  
  130.         Vypis1 PROC USES eax ecx edx paMnozina
  131.    
  132.     mov ecx, 32
  133.    
  134.     Prechod:
  135.     mov edx, 1
  136.     shl edx, cl
  137.     test paMnozina, edx ; paMnozina - parameter volany hodnotou
  138.     jnz Vypis
  139.     loop Prechod
  140.     jmp Koniec
  141.  
  142.         Vypis:
  143.     mov eax, ecx
  144.     mov edx, offset riadok ; chceme ich odriadkovať
  145.     call Writestring
  146.     call Write
  147.     call crlf
  148.     loop Prechod
  149.     Koniec :
  150.     ret
  151.         Vypis1 ENDP
  152.        
  153.        
  154. main PROC
  155.    
  156.     INVOKE Generuj, offset X
  157.     INVOKE Vypis1, X
  158.  
  159.    
  160.     call waitmsg
  161.     exit
  162.     main ENDP
  163.     END main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement