Jump to content
GIGN Forum

Man Ir Prob. Ar Asambleru


archijs90
 Share

Recommended Posts

Blokshēmas ir vienādas pilnīgi visur.

Uzdevums un risinājums priekš RISC16: "Atmiņā sākot no adreses D000 līdz atmiņas beigām atrodas datu masīvs. Uzrakstiet programmu, kura šajā apgabalā pozitīvos skaitļus atstās tādus kā tie ir, bet negatīvos skaitļus aizvietos ar nulli.":

0x0000:    LUI R1, 0x3FF                (0110011111111111)    # uz R1 uzstādam sākuma adreses 1. daļu
0x0001:    ADDI R1, R1, 0x03C          (0010010010111100) # 2. daļu ( achtung - šite neuzstāda uz uzdevuma D000, bet gan FFFC, spēlēties var pēc vajadzības )
0x0002:    LUI R2, 0x200                 (0110101000000000) // iekš R2 uzstādam bitmasku, pret ko čekot pozitīvs/nepozitīvs ( 1000 0000 0000 0000 )
0x0003:    LW R3, R1, 0x000           (1000110010000000) // ielasa čekojamo vārdu no R1 adreses iekš R3
0x0004:    NAND R3, R3, R2                (0100110110000010) // salīdzina R3 ar masku no R2
0x0005:    NAND R3, R3, R3                (0100110110000011) // apgriež riņķī R3
0x0006:    BEQ R3, R0, 0x001            (1100110000000001) // ja R3 ir 0, tad vecākais bits bija 0, tad tas bija pozitīvs, lecam tālāk
0x0007:    SW R0, R1, 0x000            (1010000010000000) // ja nekur neaizlecām, ierakstam skaitļa vietā 0 ( adrese glabājas R1 joprojām )
0x0008:    ADDI R1, R1, 0x001            (0010010010000001) // palielinam adreses skaitītāju par 1
0x0009:    BEQ R1, R0, 0x001             (1100010000000001) // ja adrese ir 0 ( nākamā pēc FFFF ), lecam pāri nākošajai instrukcijai
0x000A:    BEQ R0, R0, 0x078             (1100000001111000) // nekur neaizlecām? lecam atpakaļ uz cikla sākumu ( uz 0x0003 adresi, 8. lauciņus atpakaļ )
0x000B:    JALR R0, R0                (1110000001111111) // aizlecām? HALT!

:D

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...