Monday, November 21, 2005

ถึงคราวต้องสร้าง Virtual Machine แล้ว (พื้นฐาน)

เพื่อให้เห็นภาพ ว่าที่ผ่าน ๆ มา มันเป็นอะไร คราวนี้ มาลองสร้าง Virtual Machine กันเถอะ ... มาสรุปสิ่งที่ Virtual Machine ควรจะมีก่อน ... ครั้งนี้คิดสำหรับ process เดียวก่อนนะ

Memory Units

เพื่อให้สามารถสร้าง memory module ได้ เราต้องกำหนดไว้ก่อนว่า แต่ละ word มีขนาดเท่าไหร่ ... สมมติเลยละกันนะ ว่า

ตำแหน่งของ memory 1 ตำแหน่ง จะเก็บข้อมูลได้ 1 byte
ขนาดของ instruction = 4 byte

Process Space
  • PC - Program Counter
  • Memory - แบ่งเป็น
    • Stack
      • SP - Stack Pointer
      • BP - Base Pointer
    • Heap
  • MA - Memory Address
  • AC - Accumulator
  • FP - Frame Pointer
และ operation ที่เกี่ยวกับ memory พื้นฐาน ก็คือ
  • load: AC ← mem[MA]
  • store: mem[MA] ← AC
  • push X: SP ← SP - 4; mem[SP] ← X
  • pop X: X ← mem[SP]; SP ← SP + 4
Instruction Set

ก่อนอื่น ตกลงกันก่อนว่า ส่วนของ OPCODE เราจะยังไม่ใส่ตัวเลขลงไป แต่สมมติว่ามันกินเนื้อที่ 4 byte (เพื่อให้ง่ายเวลา implement จริงเป็นวงจรด้วย) instruction set ที่เราต้องทำ มีสามกลุ่ม คือ

Fundamental Instructions

PUSH X
  • คำสั่งนี้ พิเศษกว่าคำสั่งอื่นตรงที่มันมี operand ด้วย ... ดังนั้น ขนาดของคำสั่งนี้จะต้องรวม X ลงไปด้วย ... เราจะกำหนดให้ 4 byte แรกเป็น opcode และ 4 byte หลังคือ X รวมกันเป็น 8 byte ต่อการ PUSH 1 ครั้ง
  • การทำงาน: push X
PBASE
  • การทำงาน: push BP
LOAD
  • การทำงาน: pop MA; load; push AC
STORE
  • การทำงาน: pop AC; pop MA; store
JMP
  • การทำงาน: pop PC
JPOS
  • การทำงาน: pop AC; if AC > 0, pop PC, else pop AC
JNEG
  • การทำงาน: pop AC; if AC < 0, pop PC, else pop AC
JZ
  • การทำงาน: pop AC; if AC = 0, pop PC, else pop AC
JNZ
  • การทำงาน: pop AC; if AC ≠ 0, pop PC, else pop AC
CALL
  • การทำงาน: pop AC; push PC + 4; push BP; BP ← SP; PC ← AC
RETURN
  • การทำงาน: pop AC; SP ← BP; pop BP; pop PC; push AC
Dynamic Allocation Instructions

คำสั่งในกลุ่มนี้มีสองคำสั่งคือ ALLOC กับ FREE การทำงานของมันจะพิเศษหน่อย เพราะมันเป็น OS-Level Instruction ดังนั้น จะไม่สามารถ implement เป็น hardware ได้ตรง ๆ

ALLOC
  • การทำงาน: pop AC; AC ← malloc(AC); push AC
FREE
  • การทำงาน: pop AC; free(AC)
Arithmetic and Logical Instructions

พวกนี้ จะมีเยอะเท่าไหร่ก็ได้ ... หลัก ๆ จะมีสองกลุ่มคือ unary กับ binary แต่ถ้าจะทำเพิ่ม ก็ทำได้เรื่อย ๆ นะ

NEG
  • การทำงาน: pop AC; push -AC
ADD
  • การทำงาน: pop MA; pop AC; push AC + MA
SUB
  • การทำงาน: pop MA; pop AC; push AC - MA
MUL
  • การทำงาน: pop MA; pop AC; push AC * MA
DIV
  • การทำงาน: pop MA; pop AC; push AC / MA
MOD
  • การทำงาน: pop MA; pop AC; push AC mod MA
ส่วนคำสั่งที่เป็นด้าน logic เราจะถือว่า 0 = false และ ค่าอื่น ๆ = true นะ (แต่ค่า true ที่เป็น output ของ operation จะกำหนดให้เป็น 1 เลย)

NOT
  • การทำงาน: pop AC; push ¬AC
AND
  • การทำงาน: pop MA; pop AC; push AC ∧ MA
OR
  • การทำงาน: pop MA; pop AC; push AC ∨ MA
IFF
  • การทำงาน: pop MA; pop AC; push AC ↔ MA
XOR
  • การทำงาน: pop MA; pop AC; push ¬(AC ↔ MA)
NAND
  • การทำงาน: pop MA; pop AC; push ¬(AC ∧ MA)
NOR
  • การทำงาน: pop MA; pop AC; push ¬(AC ∨ MA)
แล้วจะมาต่อเรื่อง Floating Point อีกทีนะ

2 Comments:

At 12/20/2005 12:48 AM, Anonymous Anonymous said...

วันนี้กิมจิก็หมักครบ30วันแล้วสินะ!!

 
At 2/05/2009 3:32 AM, Blogger Rit said...

อ่าน blog นายมาหลายปี พึ่งเห็นหรือไม่ก็ลืมไปแล้ว ....
ว่าแต่ไม่เขียนต่อแล้วอ่ะ...

 

Post a Comment

<< Home