SEN2201 · 7. hafta · ISA Overview (Memory organization and registers)

LC-3 ISA: bellek, register'lar, operate ve veri taşıma komutları

LC-3'ün bellek düzeni, register'ları ve condition code'ları; ADD/AND/NOT ile LD/LDI/LDR/LEA/ST/STI/STR komutları, adresleme kipleri ve 16 bitlik makine kodunu elle kodlama-çözme.

instruction set architecture (ISA)opcodeoperate instructiondata movement instructionimmediatesign extensionaddressing modePC-relativeindirectbase+offsetcondition codes (N, Z, P)register fileword-addressableeffective address
  1. ve 8. hafta dersin merkezi: LC-3’ün komut kümesi (ISA). Şimdiye kadar öğrendiğin her şey burada birleşiyor: 2’s complement (offset’ler), sign extension (imm5), decoder (opcode), mux ve register (veri yolu), komut döngüsü (fazlar). Bu sayfada LC-3’ün yapısını, hesap yapan operate komutlarını ve bellekle register arasında veri taşıyan data movement komutlarını görüyorsun. Dallanma ve döngüler 8. haftada.

Sınavda soru tipleri: bir komutu 16 bitlik makine koduna çevir (encode), bir hex değeri komuta çevir (decode), etkin adresi hesapla, kısa bir programı izleyip register değerlerini ve condition code’ları yaz.

LC-3’ün yapısı

ÖğeLC-3’te
Bellek2162^{16} = 65536 konum, her biri 16 bit (word-addressable)
Genel amaçlı registerR0-R7, her biri 16 bit
Komut uzunluğuHer komut tam 16 bit
OpcodeIR[15:12], 4 bit → 16 değer (15 komut + 1 ayrılmış)
Condition codesN, Z, P (her an tam biri 1)
Veri tipi16 bit 2’s complement tam sayı
Özel register’larPC, IR, MAR, MDR, PSR

Kullanıcı programları genelde x3000’den başlar. x0000-x00FF trap vector table, xFE00 ve üstü aygıt register’ları (6. hafta).

Condition codes

Bir register’a değer yazan her komut (ADD, AND, NOT, LD, LDI, LDR), yazılan değere göre üç bitten birini 1 yapar:

Yazılan değerNZP
negatif (bit 15 = 1)100
sıfır010
pozitif001

Belleğe yazan (ST, STI, STR) ve dallanma komutları condition code’ları değiştirmez. 8. haftada BR komutu tam bu bitlere bakarak karar verecek.

TUZAK · LEA ve condition code. Kitabın 2. baskısında (bu dersin kitabı) LEA da condition code’ları ayarlar; 3. baskıda ayarlamaz. Sınavda LEA’dan hemen sonra gelen bir BR görürsen hocanın hangi kuralı kullandığına dikkat et; en güvenlisi, BR’den önce asıl değeri yazan komutu koymak.

Opcode tablosu

OpcodeKomutTür
0001ADDoperate
0101ANDoperate
1001NOToperate
0010LDdata movement (PC-relative)
1010LDIdata movement (indirect)
0110LDRdata movement (base+offset)
1110LEAadres hesabı
0011STdata movement (PC-relative)
1011STIdata movement (indirect)
0111STRdata movement (base+offset)
0000BRcontrol
1100JMP / RETcontrol
0100JSR / JSRRcontrol (alt program)
1111TRAPcontrol (işletim sistemi)
1000RTIcontrol (kesmeden dönüş)
1101ayrılmış

Operate komutları: ADD, AND, NOT

ADD ve AND’in iki biçimi var. Bit 5 hangisi olduğunu söyler.

register modu:   op  | DR  | SR1 | 0 | 00 | SR2
                 15-12 11-9  8-6   5   4-3  2-0
immediate modu:  op  | DR  | SR1 | 1 | imm5
                 15-12 11-9  8-6   5   4-0
NOT:             1001| DR  | SR  | 111111
  • ADD R5, R1, R3: R5 ← R1 + R3.
  • ADD R3, R1, #-4: R3 ← R1 + SEXT(imm5). imm5 = -4 = 11100, 16 bite 1111 1111 1111 1100 olarak genişletilir.
  • NOT R1, R1: R1’in her bitini çevirir.

imm5 aralığı -16..+15. Daha büyük bir sabit gerekiyorsa onu belleğe .FILL ile koyup LD ile yüklemelisin.

Kodlama örneği

AND R4, R3, #15:

0101 | 100 | 011 | 1 | 01111
AND    R4    R3    imm  +15
0101 1000 1110 1111 = x58EF

Hazır kalıplar

İşKomutNeden
R1 = 0AND R1, R1, #0Her şey AND 0 = 0
R2 = R1ADD R2, R1, #0+0 kopyalar
R2 = 2·R2ADD R2, R2, R2Kendisiyle toplam = sola kaydırma
R3 = -R2NOT R3, R2 + ADD R3, R3, #12’s complement
R3 = R1 OR R2NOT R1, NOT R2, AND, NOTDeMorgan

NOT’un tek başına sonucu −x−1-x - 1‘dir: NOT 7 = -8. +1 eklemeyi unutma.

Adresleme kipleri (addressing modes)

Bir operand nerede olabilir? LC-3’te beş cevap var:

KipOperand nerede?Komutlar
Registerregister’daADD R1, R2, R3
Immediatekomutun içindeADD R1, R1, #5
PC-relativeM[PC + offset9]LD, ST
IndirectM[M[PC + offset9]]LDI, STI
Base+offsetM[BaseR + offset6]LDR, STR

LEA da PC + offset9 hesaplar ama belleği okumaz; adresin kendisini register’a koyar.

PC-relative: LD ve ST

LD/ST:  op | DR/SR | PCoffset9
adres = (artmış PC) + SEXT(PCoffset9)

PC artmış olarak kullanılır. Komut x3010’daysa FETCH bittiğinde PC = x3011’dir. Offset buna eklenir. Offset 9 bit, aralık -256..+255: komut, kendisinin yaklaşık 256 konum yakınına erişebilir.

LD R2, #-5 x3010’da: adres = x3011 - 5 = x300C.

0010 | 010 | 1 1111 1011 = x25FB
LD     R2    -5

TUZAK · offset’i komutun kendi adresine eklemek. x3010 + (-5) = x300B yazan puan kaybeder. FETCH’te PC zaten bir artmıştı: x3011 + (-5) = x300C.

Indirect: LDI ve STI

Bellekte bir adres saklıdır. Önce o adres okunur, sonra o adresteki veri.

LDI R3, #2 (x3000'de)
1) x3001 + 2 = x3003       M[x3003] = x4000   (bu bir pointer)
2) M[x4000] = x0042  →  R3 = x0042

Uzak adreslere (örneğin xFE00 aygıt register’ları) ulaşmanın yolu budur.

Base+offset: LDR ve STR

LDR/STR:  op | DR/SR | BaseR | offset6
adres = BaseR + SEXT(offset6)      aralık -32..+31

Base register 16 bit olduğu için belleğin her yerine ulaşılır. Diziler, yığın (stack) ve pointer’lar bu kiple çalışır (C haftalarında göreceksin).

STR R2, R5, #-1 ile R5 = x4001, R2 = x00AA → M[x4000] = x00AA.

LEA: adresi yükle

LEA R1, ARR → R1 ← ARR’ın adresi. Bellek okunmaz. Bir dizinin başlangıç adresini almak için LEA, sonra elemanlara LDR ile erişilir:

        LEA  R1, ARR       ; R1 = x3005 (ARR'ın adresi)
        LDR  R2, R1, #2    ; R2 = ARR[2] = 10
        LDR  R3, R1, #0    ; R3 = ARR[0] = 7
        ADD  R4, R2, R3    ; R4 = 17
        HALT
ARR     .FILL #7
        .FILL #-2
        .FILL #10

Çözme (decode) tarifi

  1. Hex’i 16 bite aç.
  2. İlk 4 bit opcode, tabloya bak.
  3. Opcode’un formatına göre kalan 12 biti alanlara böl.
  4. Offset varsa sign extend et, adres gerekiyorsa artmış PC’ye ekle.

Örnek: x2A10, x3100 adresinde.

0010 101 0 0001 0000
LD   R5  PCoffset9 = 0 0001 0000 = +16
adres = x3101 + 16 = x3101 + x10 = x3111
→ LD R5, x3111    (R5 ← M[x3111])

Örnek: x7F3F.

0111 111 100 111111
STR  R7  R4  offset6 = 111111 = -1
→ STR R7, R4, #-1    (M[R4 - 1] ← R7)

Çözümlü iz

        .ORIG x3000
        LD   R1, A        ; R1 = 13
        LD   R2, B        ; R2 = -6
        ADD  R3, R1, R2   ; R3 = 7
        AND  R4, R3, #7   ; R4 = 7
        NOT  R5, R4       ; R5 = -8
        ST   R3, C        ; M[C] = 7
        HALT
A       .FILL #13
B       .FILL #-6
C       .BLKW 1
        .END

Assembler’ın ürettiği makine kodu:

x3000  x2206   LD  R1, A      (x3001 + 6 = x3007 = A)
x3001  x2406   LD  R2, B      (x3002 + 6 = x3008 = B)
x3002  x1642   ADD R3, R1, R2
x3003  x58E7   AND R4, R3, #7
x3004  x9B3F   NOT R5, R4
x3005  x3603   ST  R3, C      (x3006 + 3 = x3009 = C)
x3006  xF025   HALT
x3007  x000D   A = 13
x3008  xFFFA   B = -6
x3009  x0000   C

Sonuç: R3 = 7, R4 = 7, R5 = xFFF8 (-8), M[x3009] = 7. Son CC’yi ayarlayan komut NOT (R5 negatif) → N. ST CC’yi değiştirmedi.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Offset komutun kendi adresine eklenirArtmış PC’ye (adres + 1)
imm5 aralığı 0..31-16..+15, sign extend edilir
LEA bellekten okurSadece adresi hesaplar
LDI = LDLDI iki kez okur: önce adres, sonra veri
LDR offset’i 9 bit6 bit, -32..+31
ST condition code’u ayarlarBelleğe yazanlar CC’ye dokunmaz
NOT x = -xNOT x = -x - 1; -x için +1 ekle
Bit 5 = 0 → immediateBit 5 = 1 immediate, 0 register

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

Encode ADD R3, R1, #-4 as a 16-bit LC-3 machine instruction in hex.

Cevabı göster
x167C

Format: 0001 | DR | SR1 | 1 | imm5. DR = R3 = 011, SR1 = R1 = 001, bit 5 = 1 (immediate), imm5 = -4 = 11100.
0001 011 001 1 11100 → 0001 0110 0111 1100 = x167C.

Soru 2kolay

Decode the LC-3 instruction x1A43.

Cevabı göster
ADD R5, R1, R3

x1A43 = 0001 1010 0100 0011. Opcode 0001 = ADD. DR = bits 11:9 = 101 = R5. SR1 = bits 8:6 = 001 = R1. Bit 5 = 0 → register modu, SR2 = bits 2:0 = 011 = R3.

Soru 3kolay

Decode x927F.

Cevabı göster
NOT R1, R1

1001 0010 0111 1111. Opcode 1001 = NOT. DR = 001, SR = 001, bits 5:0 = 111111 (NOT'ta hep 1). R1 ← NOT R1.

Soru 4kolay

What is the range of the immediate value in ADD DR, SR1, #imm5?

Cevabı göster
-16 to +15

imm5, 5 bitlik 2's complement'tir: −24…24−1-2^4 \ldots 2^4 - 1. Çalışırken 16 bite sign extension yapılır. #16 ya da #-17 yazarsan assembler hata verir.

Soru 5orta

The instruction LD R2, LABEL is at address x3010 and its PCoffset9 is -5. Which address is read, and what is the machine code?

Cevabı göster
x300C, x25FB

Adres = artmış PC + SEXT(offset) = x3011 + (-5) = x300C. PC FETCH'te artmıştır, offset x3010'a değil x3011'e eklenir.
Kod: 0010 | 010 | 1 1111 1011 → 0010 0101 1111 1011 = x25FB.

Soru 6orta

LEA R0, #10 is at address x3005. What value is placed in R0? Does LEA access memory?

Cevabı göster
x3010, no

LEA adresi hesaplar ve adresin kendisini R0'a koyar: x3006 + 10 = x3006 + xA = x3010. Belleği okumaz. 'Load Effective Address' adı buradan gelir.

Soru 7orta

Before execution, M[x3003] = x4000 and M[x4000] = x0042. What does LDI R3, #2 at address x3000 load into R3?

Cevabı göster
x0042

LDI iki adımda okur. 1) x3001 + 2 = x3003; M[x3003] = x4000, bu bir adres. 2) M[x4000] = x0042 → R3. Condition code P olur.

Soru 8kolay

R6 = x5000 and M[x5004] = xFFFE. After LDR R1, R6, #4, what are R1 and the condition codes?

Cevabı göster
R1 = xFFFE, N

Adres = R6 + SEXT(offset6) = x5000 + 4 = x5004. R1 ← M[x5004] = xFFFE = -2. Negatif olduğu için N = 1.

Soru 9orta

Write three LC-3 instructions that compute R3 = R1 - R2 (R1 and R2 must not change).

Cevabı göster
NOT R3, R2; ADD R3, R3, #1; ADD R3, R1, R3

LC-3'te SUB yok. 2's complement: −R2=NOT(R2)+1-R2 = \text{NOT}(R2) + 1. Önce R3 ← NOT R2, sonra R3 ← R3 + 1 (artık -R2), en son R3 ← R1 + R3. Örnek: R1 = 20, R2 = 27 → R3 = -7 = xFFF9, CC = N.

Soru 10orta

What are R3, R4, R5 and the memory location C after this program runs?

        .ORIG x3000
        LD   R1, A
        LD   R2, B
        ADD  R3, R1, R2
        AND  R4, R3, #7
        NOT  R5, R4
        ST   R3, C
        HALT
A       .FILL #13
B       .FILL #-6
C       .BLKW 1
        .END
Cevabı göster
R3 = 7, R4 = 7, R5 = -8 (xFFF8), C = 7

R1 = 13, R2 = -6. R3 = 13 + (-6) = 7 = 0000 0000 0000 0111.
R4 = 7 AND 7 = 7 (alt 3 bit). R5 = NOT 7 = 1111 1111 1111 1000 = xFFF8 = -8 (NOT x = -x - 1).
ST R3, C → M[C] = 7. ST condition code'u değiştirmez.

Soru 11orta

Which of these instructions set the condition codes: ADD, ST, LDR, STR, NOT, AND?

Cevabı göster
ADD, LDR, NOT, AND

Condition code'lar bir register'a değer YAZAN komutlarca ayarlanır: ADD, AND, NOT, LD, LDI, LDR (ve kitabın 2. baskısında LEA). Belleğe yazan ST, STI, STR ve dallanma komutları CC'yi değiştirmez.

Soru 12zor

Decode xE1FD located at address x3050. What does it put in R0?

Cevabı göster
LEA R0, offset -3 → R0 = x304E

1110 0001 1111 1101: opcode 1110 = LEA, DR = 000 = R0, PCoffset9 = 1 1111 1101 = -3.
R0 = x3051 + (-3) = x304E.

Doğrulama: Her kodlama, çözme ve iz kendi yazdığımız LC-3 assembler + simülatöründe (verify/SEN2201/lc3.mjs) üretildi; register değerleri, condition code'lar ve bellek içerikleri oradan alındı (verify/SEN2201/07.mjs). LEA'nın condition code davranışı kitabın 2. baskısına göredir.

Deftere not kartı

Bellek 2^16 × 16 bit, word-addressable | R0-R7 (16 bit) | PC, IR | CC: N Z P (tam biri 1) Opcode IR[15:12]: ADD 0001 AND 0101 NOT 1001 LD 0010 LDI 1010 LDR 0110 LEA 1110 ST 0011 STI 1011 STR 0111 BR 0000 JMP 1100 JSR 0100 TRAP 1111 RTI 1000 ADD/AND: op DR SR1 0 00 SR2 | op DR SR1 1 imm5 (-16..15, SEXT) NOT: 1001 DR SR 111111 LD/LDI/LEA/ST/STI: op R PCoffset9 -> adres = (PC+1) + SEXT(off9), aralık -256..255 LDR/STR: op R BaseR off6 -> adres = BaseR + SEXT(off6), aralık -32..31 LD: R <- M[PC+off] | LDI: R <- M[M[PC+off]] | LDR: R <- M[Base+off] | LEA: R <- PC+off (bellek yok) ST: M[PC+off] <- R | STI: M[M[PC+off]] <- R | STR: M[Base+off] <- R CC'yi ayarlayan: ADD AND NOT LD LDI LDR (LEA 2. baskıda evet) | ST/STI/STR/BR hayır Temizle: AND R,R,#0 | Kopyala: ADD R2,R1,#0 | -x: NOT, ADD #1 | OR: NOT-AND-NOT