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.
- 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ı
| Öğe | LC-3’te |
|---|---|
| Bellek | = 65536 konum, her biri 16 bit (word-addressable) |
| Genel amaçlı register | R0-R7, her biri 16 bit |
| Komut uzunluğu | Her komut tam 16 bit |
| Opcode | IR[15:12], 4 bit → 16 değer (15 komut + 1 ayrılmış) |
| Condition codes | N, Z, P (her an tam biri 1) |
| Veri tipi | 16 bit 2’s complement tam sayı |
| Özel register’lar | PC, 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ğer | N | Z | P |
|---|---|---|---|
| negatif (bit 15 = 1) | 1 | 0 | 0 |
| sıfır | 0 | 1 | 0 |
| pozitif | 0 | 0 | 1 |
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
| Opcode | Komut | Tür |
|---|---|---|
| 0001 | ADD | operate |
| 0101 | AND | operate |
| 1001 | NOT | operate |
| 0010 | LD | data movement (PC-relative) |
| 1010 | LDI | data movement (indirect) |
| 0110 | LDR | data movement (base+offset) |
| 1110 | LEA | adres hesabı |
| 0011 | ST | data movement (PC-relative) |
| 1011 | STI | data movement (indirect) |
| 0111 | STR | data movement (base+offset) |
| 0000 | BR | control |
| 1100 | JMP / RET | control |
| 0100 | JSR / JSRR | control (alt program) |
| 1111 | TRAP | control (işletim sistemi) |
| 1000 | RTI | control (kesmeden dönüş) |
| 1101 | ayrı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
| İş | Komut | Neden |
|---|---|---|
| R1 = 0 | AND R1, R1, #0 | Her şey AND 0 = 0 |
| R2 = R1 | ADD R2, R1, #0 | +0 kopyalar |
| R2 = 2·R2 | ADD R2, R2, R2 | Kendisiyle toplam = sola kaydırma |
| R3 = -R2 | NOT R3, R2 + ADD R3, R3, #1 | 2’s complement |
| R3 = R1 OR R2 | NOT R1, NOT R2, AND, NOT | DeMorgan |
NOT’un tek başına sonucu ‘dir: NOT 7 = -8. +1 eklemeyi unutma.
Adresleme kipleri (addressing modes)
Bir operand nerede olabilir? LC-3’te beş cevap var:
| Kip | Operand nerede? | Komutlar |
|---|---|---|
| Register | register’da | ADD R1, R2, R3 |
| Immediate | komutun içinde | ADD R1, R1, #5 |
| PC-relative | M[PC + offset9] | LD, ST |
| Indirect | M[M[PC + offset9]] | LDI, STI |
| Base+offset | M[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
- Hex’i 16 bite aç.
- İlk 4 bit opcode, tabloya bak.
- Opcode’un formatına göre kalan 12 biti alanlara böl.
- 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üşünce | Doğrusu |
|---|---|
| Offset komutun kendi adresine eklenir | Artmış PC’ye (adres + 1) |
| imm5 aralığı 0..31 | -16..+15, sign extend edilir |
| LEA bellekten okur | Sadece adresi hesaplar |
| LDI = LD | LDI iki kez okur: önce adres, sonra veri |
| LDR offset’i 9 bit | 6 bit, -32..+31 |
| ST condition code’u ayarlar | Belleğe yazanlar CC’ye dokunmaz |
| NOT x = -x | NOT x = -x - 1; -x için +1 ekle |
| Bit 5 = 0 → immediate | Bit 5 = 1 immediate, 0 register |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Encode ADD R3, R1, #-4 as a 16-bit LC-3 machine instruction in hex.
Cevabı göster
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.
Decode the LC-3 instruction x1A43.
Cevabı göster
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.
Decode x927F.
Cevabı göster
1001 0010 0111 1111. Opcode 1001 = NOT. DR = 001, SR = 001, bits 5:0 = 111111 (NOT'ta hep 1). R1 ← NOT R1.
What is the range of the immediate value in ADD DR, SR1, #imm5?
Cevabı göster
imm5, 5 bitlik 2's complement'tir: . Çalışırken 16 bite sign extension yapılır. #16 ya da #-17 yazarsan assembler hata verir.
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
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.
LEA R0, #10 is at address x3005. What value is placed in R0? Does LEA access memory?
Cevabı göster
LEA adresi hesaplar ve adresin kendisini R0'a koyar: x3006 + 10 = x3006 + xA = x3010. Belleği okumaz. 'Load Effective Address' adı buradan gelir.
Before execution, M[x3003] = x4000 and M[x4000] = x0042. What does LDI R3, #2 at address x3000 load into R3?
Cevabı göster
LDI iki adımda okur. 1) x3001 + 2 = x3003; M[x3003] = x4000, bu bir adres. 2) M[x4000] = x0042 → R3. Condition code P olur.
R6 = x5000 and M[x5004] = xFFFE. After LDR R1, R6, #4, what are R1 and the condition codes?
Cevabı göster
Adres = R6 + SEXT(offset6) = x5000 + 4 = x5004. R1 ← M[x5004] = xFFFE = -2. Negatif olduğu için N = 1.
Write three LC-3 instructions that compute R3 = R1 - R2 (R1 and R2 must not change).
Cevabı göster
LC-3'te SUB yok. 2's complement: . Ö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.
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
.ENDCevabı göster
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.
Which of these instructions set the condition codes: ADD, ST, LDR, STR, NOT, AND?
Cevabı göster
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.
Decode xE1FD located at address x3050. What does it put in R0?
Cevabı göster
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.