From a74ebc3fc15064bf3f0df46fcef7ae51d5664809 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 17:11:02 +0400 Subject: [PATCH 1/9] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=B0=20BYTECODE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 notes/BYTECODE.md diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md new file mode 100644 index 0000000..d7f62bc --- /dev/null +++ b/notes/BYTECODE.md @@ -0,0 +1,5 @@ +Формат байт-кода dwarf-vm +========================= + +Инструкции +---------- From ca5e2829b83c8bb4bd40a66be0e7b6566e7b2276 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 17:51:36 +0400 Subject: [PATCH 2/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index d7f62bc..cf77c83 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -1,5 +1,33 @@ Формат байт-кода dwarf-vm ========================= +Типы данных +----------- + +Название | Описание | Размер (байт) +----------- |---------------------------------------|-------------- +int | Целое число | 8 +reg_num | Номер регистра | 2 +addr_offset | Смещение относительно счетчика команд | 4 + Инструкции ---------- + + Код | Мнемоника | Описание + --- | ---------------- | --------------------------------- + 00 | HALT | Останов программы + 01 | IADD | A = pop(); B = pop(); push(A + B) + 02 | ISUB | A = pop(); B = pop(); push(A + B) + 03 | IMUL | A = pop(); B = pop(); push(A + B) + 04 | IDIV | A = pop(); B = pop(); push(A + B) + 05 | DUP | A = peek(); push(A) + 06 | IPUSHC NUM:int | push(NUM) + 07 | IPUSHREG N:reg_num | push(RegN) + 08 | IPOPREG N:reg_num | RegN = pop() + 09 | JMP OFF:addr_offset | PC = PC + OFF + 0A | JZ OFF:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } + 0B | JNZ OFF:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } + 0C | ICMP | FIXME + 0D | EQ | FIXME + 0E | PRINT | Печатает число с верхушки стека на устройсве вывода + 0F | DEBUG | FIXME From d1de747e2e151fbe22628013be0f406ff1c8b150 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 17:53:56 +0400 Subject: [PATCH 3/9] =?UTF-8?q?=D0=92=D1=8B=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index cf77c83..75b1073 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -21,12 +21,12 @@ addr_offset | Смещение относительно счетчика ком 03 | IMUL | A = pop(); B = pop(); push(A + B) 04 | IDIV | A = pop(); B = pop(); push(A + B) 05 | DUP | A = peek(); push(A) - 06 | IPUSHC NUM:int | push(NUM) - 07 | IPUSHREG N:reg_num | push(RegN) - 08 | IPOPREG N:reg_num | RegN = pop() - 09 | JMP OFF:addr_offset | PC = PC + OFF - 0A | JZ OFF:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } - 0B | JNZ OFF:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } + 06 | IPUSHC *NUM*:int | push(NUM) + 07 | IPUSHREG *N*:reg_num | push(RegN) + 08 | IPOPREG *N*:reg_num | RegN = pop() + 09 | JMP *OFF*:addr_offset | PC = PC + OFF + 0A | JZ *OFF*:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } + 0B | JNZ *OFF*:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } 0C | ICMP | FIXME 0D | EQ | FIXME 0E | PRINT | Печатает число с верхушки стека на устройсве вывода From ed1c494f18edc652b16c25e363c7a7db20cb06c9 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 19:00:10 +0400 Subject: [PATCH 4/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 75b1073..344e78e 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -17,9 +17,9 @@ addr_offset | Смещение относительно счетчика ком --- | ---------------- | --------------------------------- 00 | HALT | Останов программы 01 | IADD | A = pop(); B = pop(); push(A + B) - 02 | ISUB | A = pop(); B = pop(); push(A + B) - 03 | IMUL | A = pop(); B = pop(); push(A + B) - 04 | IDIV | A = pop(); B = pop(); push(A + B) + 02 | ISUB | A = pop(); B = pop(); push(A - B) + 03 | IMUL | A = pop(); B = pop(); push(A * B) + 04 | IDIV | A = pop(); B = pop(); push(A / B) 05 | DUP | A = peek(); push(A) 06 | IPUSHC *NUM*:int | push(NUM) 07 | IPUSHREG *N*:reg_num | push(RegN) From 5683d1cf764bf98ea97cee5413adeb453be8ca2a Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 20:25:40 +0400 Subject: [PATCH 5/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BA=D1=80=D0=B0=D1=81=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 344e78e..8825d5e 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -22,8 +22,8 @@ addr_offset | Смещение относительно счетчика ком 04 | IDIV | A = pop(); B = pop(); push(A / B) 05 | DUP | A = peek(); push(A) 06 | IPUSHC *NUM*:int | push(NUM) - 07 | IPUSHREG *N*:reg_num | push(RegN) - 08 | IPOPREG *N*:reg_num | RegN = pop() + 07 | IPUSHREG *N*:reg_num | push(Reg*N*) + 08 | IPOPREG *N*:reg_num | Reg*N* = pop() 09 | JMP *OFF*:addr_offset | PC = PC + OFF 0A | JZ *OFF*:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } 0B | JNZ *OFF*:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } From 50258f9a50d7d496d8826a41e58f9d552b094323 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 20:26:09 +0400 Subject: [PATCH 6/9] =?UTF-8?q?=D0=9A=D1=80=D0=B0=D1=81=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 8825d5e..344e78e 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -22,8 +22,8 @@ addr_offset | Смещение относительно счетчика ком 04 | IDIV | A = pop(); B = pop(); push(A / B) 05 | DUP | A = peek(); push(A) 06 | IPUSHC *NUM*:int | push(NUM) - 07 | IPUSHREG *N*:reg_num | push(Reg*N*) - 08 | IPOPREG *N*:reg_num | Reg*N* = pop() + 07 | IPUSHREG *N*:reg_num | push(RegN) + 08 | IPOPREG *N*:reg_num | RegN = pop() 09 | JMP *OFF*:addr_offset | PC = PC + OFF 0A | JZ *OFF*:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } 0B | JNZ *OFF*:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } From 3f1e4b73c9a407f7feb5184966aa9deeeb54130b Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 20:34:10 +0400 Subject: [PATCH 7/9] Update BYTECODE.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил примечание относительно адресов перехода в JMP/JZ/JNZ --- notes/BYTECODE.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 344e78e..2adb62d 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -31,3 +31,9 @@ addr_offset | Смещение относительно счетчика ком 0D | EQ | FIXME 0E | PRINT | Печатает число с верхушки стека на устройсве вывода 0F | DEBUG | FIXME + + **Примечание:** для инструкций перехода адрес вычисляется с использованием PC + а тот момент, когда инструкция полностью декодирована. + + Например, инструкция *jmp -5* вводит машину в бесконечный цикл (т.к. постоянно передает управление на начало инструкции), в то время как *jmp 0* ничего не делает. + From 632c31593ea4d6608cf3d8711b4ae0aed5e2dbdf Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 20:57:33 +0400 Subject: [PATCH 8/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20JZ/JNZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 2adb62d..19241af 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -25,8 +25,8 @@ addr_offset | Смещение относительно счетчика ком 07 | IPUSHREG *N*:reg_num | push(RegN) 08 | IPOPREG *N*:reg_num | RegN = pop() 09 | JMP *OFF*:addr_offset | PC = PC + OFF - 0A | JZ *OFF*:addr_offset | A = peek(); if (A == 0) { PC = PC + OFF } - 0B | JNZ *OFF*:addr_offset | A = peek(); if (A != 0) { PC = PC + OFF } + 0A | JZ *OFF*:addr_offset | A = pop(); if (A == 0) { PC = PC + OFF } + 0B | JNZ *OFF*:addr_offset | A = pop(); if (A != 0) { PC = PC + OFF } 0C | ICMP | FIXME 0D | EQ | FIXME 0E | PRINT | Печатает число с верхушки стека на устройсве вывода From b7075a6867962211914c85be0a183f1b6624dc5a Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Tue, 12 Aug 2014 21:06:21 +0400 Subject: [PATCH 9/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20EQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/BYTECODE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/BYTECODE.md b/notes/BYTECODE.md index 19241af..8687182 100644 --- a/notes/BYTECODE.md +++ b/notes/BYTECODE.md @@ -28,7 +28,7 @@ addr_offset | Смещение относительно счетчика ком 0A | JZ *OFF*:addr_offset | A = pop(); if (A == 0) { PC = PC + OFF } 0B | JNZ *OFF*:addr_offset | A = pop(); if (A != 0) { PC = PC + OFF } 0C | ICMP | FIXME - 0D | EQ | FIXME + 0D | EQ | A = pop(); B = pop(); if (A == B) push(1); else push(0); 0E | PRINT | Печатает число с верхушки стека на устройсве вывода 0F | DEBUG | FIXME