Advertisement
Oliver_Palencar

6.4. Príklady na skokové inštrukcie

Jun 9th, 2024 (edited)
649
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MIX Assembler 5.82 KB | Source Code | 0 0
  1. 1.
  2. Spočítajte obsah registrov R3 a R5. Ak je výsledok rôzny od nuly, uložte ho na adresu 40H a ak je aj párny, uložte ho aj na adresu 41H.
  3.  
  4. start:  MOV R3,#3
  5.         MOV R5,#4
  6.         MOV A,R3
  7.         ADD A,R5
  8.         JZ nula
  9.         MOV 40h,A
  10.         JNB ACC.0,parny
  11.         SJMP nula
  12. parny:  MOV 41h,A
  13. nula:   nop
  14. end
  15.  
  16. ----------------------------druha moznost-------------------------------
  17.  
  18. start:  MOV R3, #3        // Nastavíme register R3 na hodnotu 3
  19.         MOV R5, #4        // Nastavíme register R5 na hodnotu 4
  20.         MOV A, R3         // Prenesieme hodnotu R3 do akumulátora
  21.         ADD A, R5         // Pripočítame hodnotu R5 k akumulátoru
  22.         JZ nula           // Ak je výsledok nulový, skočí na značku "nula"
  23.         MOV 40h, A        // Uložíme výsledok na adresu 40H
  24.         RRC A             // Rotujeme akumulátor doprava cez prenosový bit (testujeme najnižší bit)
  25.         JNC parny         // Ak je prenosový bit nula (výsledok bol párny), skočí na značku "parny"
  26.         SJMP nula         // Ak je výsledok nepárny, skočí na značku "nula"
  27.  
  28. parny:  MOV 41h, A        // Uložíme výsledok na adresu 41H, ak je výsledok párny
  29. nula:   NOP               // Ukončenie programu
  30. end
  31.  
  32.  
  33. 2.
  34. Urobte cyklus, ktorý postupne uloží do pamäte od adresy 60H hodnoty 0FEH, 0FFH, 0, 1, 2, 3, 4 a 5. Pri ladení programu si všimnite ako sa nastavujú príznakové bity
  35.  
  36. start:  MOV R0,#60h
  37.         MOV A,#0FEh
  38. opak:   MOV @R0,A
  39.         inc R0
  40.         inc A
  41.         CJNE A,#6,opak
  42. end
  43.  
  44.  
  45. 3.
  46. Zostavte program, ktorý realizuje časové oneskorenie úmerné veľkosti parametra, ktorý je v registroch R5 a R6.
  47.  
  48.         MOV R6,#200
  49. TAM:    MOV R5,#100
  50. TU:     DJNZ R5,TU
  51.         DJNZ R6,TU
  52. end
  53.  
  54. -------------------------------dlhsia verzia---------------------------------------
  55.  
  56.         MOV R7,#50
  57.         MOV R6,#200
  58. TAM:    MOV R5,#100
  59. TU:     DJNZ R5,TU
  60.         DJNZ R6,TU
  61.         DJNZ R7,TU
  62. end
  63.  
  64.  
  65. 4.
  66. V pamäti programu je od adresy TAB je uložená tabuľka 10-tich osembitových čísel. Prekopírujte túto tabuľku od adresy KOPIA v pamäti dát.
  67.  
  68. prog    SEGMENT CODE
  69. udaj    SEGMENT DATA
  70.         RSEG udaj
  71. Kopia:  DS 10
  72.         RSEG prog
  73. Tab:    DB 5,10,4,6,7,12,14,26,3,9
  74.         CSEG AT 0
  75. start:  MOVC R0, #Kopia         // Nastavíme ukazovateľ registra R0 na miesto, kde sa má kopírovať tabuľka.
  76.         MOV dptr, #Tab          // Nastavíme ukazovateľ dptr na začiatok tabuľky v kóde.
  77.         clr A
  78.         MOV R5, #10             // Nastavíme počet opakovaní cyklu
  79.  
  80. znovu:  MOVC A, @A+DPTR         // Načítame prvu hodnotu z tabuľky na adrese ukazovateľa dptr a priradíme ju do akumulátora A.
  81.         MOV @R0, A              // Zapíšeme hodnotu z akumulátora A na adresu určenú registrom R0.
  82.         clr A
  83.         INC R0                  // Inkrementujeme ukazovateľ registra R0, aby sme sa posunuli na ďalšiu pozíciu v pamäti.
  84.         INC DPTR                // Inkrementujeme ukazovateľ dptr, aby sme sa posunuli na ďalšiu hodnotu v tabuľke.
  85.         djnz R5, znovu          // Dekrementujeme počítadlo cyklu (registra R5) a ak nie je nula, skočíme späť na značku "znovu".
  86. end
  87.  
  88.  
  89. 5.
  90. V pamäti od adresy CISLO je uložených 10 celých kladných čísel (8-bitových). Nájdite najväčšie z nich a uložte ho do pamäte dát na adresu MAX.
  91.  
  92. prog SEGMENT CODE
  93. udaj SEGMENT DATA
  94.  
  95. RSEG udaj
  96. Max: DS 1
  97.  
  98. RSEG prog
  99. Cislo: DB 5,10,4,6,7,12,14,26,3,9
  100.  
  101. CSEG AT 0
  102.  
  103. start:  
  104.         MOV DPTR, #Cislo
  105.         MOV R2, #9
  106.         MOVC A, @A+DPTR
  107.         MOV 60H, A
  108.         INC DPTR
  109.        
  110. zac:    
  111.         MOVC A, @A+DPTR
  112.         MOV B, 60H
  113.         CJNE A, B, porov
  114.         DJNZ R2, zac
  115.  
  116. porov:  
  117.         JC pokracuj
  118.         MOV 60H, A
  119.  
  120. pokracuj:
  121.         INC DPTR
  122.         CLR A
  123.         DJNZ R2, zac
  124.  
  125. koniec:
  126.         MOV A, 60H
  127.         MOV Max, A
  128.  
  129. END
  130.  
  131.  
  132.  
  133. 6.
  134. Vytvorte program, ktorý spočíta z tabuľky 10 čísel uložených v pamäti programu od adresy TAB len tie čísla, ktoré majú 5. bit nulový. Výsledok uložte do pamäte dát od adresy SUMA.
  135.  
  136. janko   segment code
  137.         DSEG at 30h
  138. suma:   DS 2                                            // Rezervujeme 2 byty pre 16-bitový súčet na adrese 30h a 31h.
  139.         RSEG janko
  140. tab:    DB 4, 9, 89, 7, 155, 26, 148, 6, 35, 94  
  141.         CSEG at 0h
  142. start:  mov dptr, #tab                                  // Nastavíme ukazovateľ DPTR na začiatok tabuľky.
  143.         mov R1, #10                                     // Nastavíme počet čísel v tabuľke na 10.
  144. opakuj: movc A, @A+dptr                                 // Načítame ďalšie číslo z tabuľky do akumulátora.
  145.         JB ACC.5, dalej                                 // Ak je 5. bit akumulátora nastavený, skočíme na 'dalej'.
  146.        // Ak je 5. bit nulový, pridáme číslo k súčtu.
  147.         ADD A, suma                                     // Pridáme obsah akumulátora k nižšiemu bytu súčtu.
  148.         mov suma, A                                     // Uložíme výsledok do nižšieho bytu súčtu.
  149.         mov A, suma+1                                   // Načítame vyšší byt súčtu.
  150.         addc A, #0                                      // Pridáme prenesenie (ak bolo) k vyššiemu bytu súčtu.
  151.         mov suma+1, A                                   // Uložíme výsledok do vyššieho bytu súčtu.
  152. dalej:  inc dptr                                        // Inkrementujeme ukazovateľ DPTR, aby sme ukázali na ďalšie číslo.
  153.         clr A                                           // Vynulujeme akumulátor (zvyšuje prehľadnosť, ale nie je nutné).
  154.         djnz R1, opakuj                                 // Dekrementujeme R1 a ak nie je nulový, opakujeme cyklus.
  155.        // Skočíme na koniec programu po ukončení slucky.
  156.         jmp koniec
  157. koniec: nop            
  158. end
  159.  
  160.  
  161.  
  162. 7.
  163. V pamäti programu od adresy 400H je uložená tabuľka čísel ukončená nulou. Zistite počet párnych čísel v tejto tabuľke a uložte ho do pamäte dát na adresu 50H.
  164.  
  165. CSEG at 400h
  166. tab:    DB 4,9,89,7,155,26,148,6,35,94,0
  167. CSEG at 0h
  168. zaciatok:   MOV dptr,#tab
  169.             MOV R1,#10
  170.             MOV R0,#50h
  171.            
  172. pokr:       MOVC A,@A+dptr
  173.             JZ konec
  174.             JB ACC.0,dalej
  175.             inc @R0
  176.            
  177. dalej:      inc dptr
  178.             clr A
  179.             jmp pokr
  180.  
  181. konec:      nop
  182. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement