低级任务的简单模拟
项目描述
TDT4160 1.1.3
tdt4160
是IJVM微指令和伪汇编的模拟器,正如在NTNU课程TDT4160中常见,尤其是在其考试中。
此软件包有两个主要组件。tdt4160.assembly
和tdt4160.ijvm
。它们的功能是允许您在执行之前设置寄存器、内存地址和队列指令。在执行过程中,每条单独的指令都会逐步执行,并打印大量信息,以便您轻松了解正在发生的事情。技术上需要Python >= 3.7才能符合规范,但可能适用于任何>= 3.6的版本。除了标准库外,没有外部依赖。
安装
要安装tdt4160
,请运行
$ python3 -m pip install tdt4160
或从源安装
$ python3 setup.py install
简介
由于COVID-19,大多数NTNU课程已从不允许使用外部帮助/工具的考场考试转变为允许使用所有工具的家庭考试。我想,如果您现在可以使用工具,那么自动化考试应该会很搞笑。
我想得没错,这确实很搞笑。
示例用法
伪汇编
# This example from the Autumn 2020 exam, task 6
from tdt4160.assembly import *
# First set the registries as specified in the task
set_asm_registries(
R0=0xFFFF0000,
R7=0xFFFF0001,
R8=0xFFFF0002,
R9=0xFFFF0003,
)
# Then set the memory addresses as specified
set_asm_addresses({
0xFFFF0000: 0x00000001,
0xFFFF0001: 0x00000002,
0xFFFF0002: 0x00000003,
0xFFFF0003: 0x00000004,
0xFFFF0004: 0xFFFF0005
})
# Queue all the instructions to be performed
assemble(0x0000FFFE, LOAD, R8, R0)
assemble(0x0000FFFF, MOVC, R7, 1)
assemble(0x00010000, ADD, R0, R0, R7)
assemble(0x00010001, LOAD, R9, R0)
assemble(0x00010002, MUL, R9, R8, R9)
assemble(0x00010003, ADD, R9, R9, R8)
assemble(0x00010004, ADD, R0, R0, R7)
assemble(0x00010005, LOAD, R8, R0)
assemble(0x00010006, ADD, R8, R9, R8)
# Then actually run them
execute_assembly(0x0000FFFE)
# This function prints all the registries used in the task
# In this case, we're looking for R8, which is 6
print_asm_regs()
这将输出以下内容
=============================== MEMORY: 0000FFFE ===============================
INSTRUCTION: LOAD R8=FFFF0002, R0=FFFF0000
Loaded value 00000001 into R8 from address FFFF0000
=============================== MEMORY: 0000FFFF ===============================
INSTRUCTION: MOVC R7=FFFF0001, Constant=00000001
Moved value 00000001 into R7
=============================== MEMORY: 00010000 ===============================
INSTRUCTION: ADD R0=FFFF0000, R0=FFFF0000, R7=00000001
Added R0=FFFF0000+R7=00000001
Result FFFF0001 stored in R0
=============================== MEMORY: 00010001 ===============================
INSTRUCTION: LOAD R9=FFFF0003, R0=FFFF0001
Loaded value 00000002 into R9 from address FFFF0001
=============================== MEMORY: 00010002 ===============================
INSTRUCTION: MUL R9=00000002, R8=00000001, R9=00000002
Multiplied R8=00000001*R9=00000002
Result 00000002 stored in R9
=============================== MEMORY: 00010003 ===============================
INSTRUCTION: ADD R9=00000002, R9=00000002, R8=00000001
Added R9=00000002+R8=00000001
Result 00000003 stored in R9
=============================== MEMORY: 00010004 ===============================
INSTRUCTION: ADD R0=FFFF0001, R0=FFFF0001, R7=00000001
Added R0=FFFF0001+R7=00000001
Result FFFF0002 stored in R0
=============================== MEMORY: 00010005 ===============================
INSTRUCTION: LOAD R8=00000001, R0=FFFF0002
Loaded value 00000003 into R8 from address FFFF0002
=============================== MEMORY: 00010006 ===============================
INSTRUCTION: ADD R8=00000003, R9=00000003, R8=00000003
Added R9=00000003+R8=00000003
Result 00000006 stored in R8
================================================================================
R0 = 0xFFFF0002
R7 = 0x00000001
R8 = 0x00000006
R9 = 0x00000003
IJVM
# This example from the Autumn 2020 exam, task 4
from tdt4160.ijvm import *
# Set the registries as specified
set_ijvm_registries(
SP=0x10101010,
LV=0x30000000,
CPP=0x10000001,
TOS=0xFF000000,
OPC=0xABCDE000,
H=0x12345678,
MAR=0xA5A5A5A5,
MDR=0x5A5A5A5A,
PC=0x55AA55AA
)
# Queue the microinstructions to run
ijvm(0b000001000, 0b000001001, 0b000, 0b00010000, 0b100000000, 0b000, 0b1111)
ijvm(0b000001001, 0b000001011, 0b000, 0b00111001, 0b100000000, 0b000, 0b1100)
ijvm(0b000001010, 0b000010000, 0b001, 0b01011000, 0b010101010, 0b000, 0b0001)
ijvm(0b000001011, 0b000001100, 0b000, 0b00111100, 0b100000000, 0b000, 0b0101)
ijvm(0b000001100, 0b000000000, 0b000, 0b00111100, 0b000010000, 0b000, 0b0101)
ijvm(0b000001101, 0b000001110, 0b000, 0b00110010, 0b001000101, 0b100, 0b1000)
# Actually run them
execute_ijvm(0b000001000)
# Print the value of all the registries after execution
# In this case, we're looking for several registries, so just check the ones you want
print_all_ijvm()
这将输出以下内容
======================= Instruction address: 0x000001000 =======================
next=0b000001001 JAM=0b000 ALU=0b00010000 C=0b100000000 Mem=0b000 B=0b1111
ALU is 0b010000, function: 0
Result of operation: 0x00000000
Final result: 0x00000000
C is 0b100000000
The following registries take the value of 0x00000000
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001001
======================= Instruction address: 0x000001001 =======================
next=0b000001011 JAM=0b000 ALU=0b00111001 C=0b100000000 Mem=0b000 B=0b1100
ALU is 0b111001, function: A + 1
A is always H=0x00000000
Result of operation: 0x00000001
Final result: 0x00000001
C is 0b100000000
The following registries take the value of 0x00000001
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001011
======================= Instruction address: 0x000001011 =======================
next=0b000001100 JAM=0b000 ALU=0b00111100 C=0b100000000 Mem=0b000 B=0b0101
ALU is 0b111100, function: A + B
A is always H=0x00000001
B is 0b0101 (5), yielding LV=0x30000000
Result of operation: 0x30000001
Final result: 0x30000001
C is 0b100000000
The following registries take the value of 0x30000001
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001100
======================= Instruction address: 0x000001100 =======================
next=0b000000000 JAM=0b000 ALU=0b00111100 C=0b000010000 Mem=0b000 B=0b0101
ALU is 0b111100, function: A + B
A is always H=0x30000001
B is 0b0101 (5), yielding LV=0x30000000
Result of operation: 0x60000001
Final result: 0x60000001
C is 0b000010000
The following registries take the value of 0x60000001
LV
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000000000
================================================================================
Next instruction is 0. We're done
SP = 0x10101010
LV = 0x60000001
CPP = 0x10000001
TOS = 0xFF000000
OPC = 0xABCDE000
H = 0x30000001
MAR = 0xA5A5A5A5
MDR = 0x5A5A5A5A
PC = 0x55AA55AA
MBR = 0xUNINITIALIZED
MBRU = 0xUNINITIALIZED
MPC = 0x00000000
请注意,未初始化的值从未被触及,因此它们保持未初始化状态。只要我们不使用它们,这就可以了。
挪威语
tdt4160
是一个用于 IJVM 微架构和伪汇编代码的仿真器,常在 NTNU 的 TDT4160 课程 的考试中出现。
该软件包包含两个主要部分:tdt4160.assembly
和 tdt4160.ijvm
。两者都允许用户设置寄存器、内存地址,并将指令加入队列以执行。在指令执行过程中,会打印大量关于实际执行情况的信息,以便更容易地观察发生了什么。理论上,该软件包需要 Python 3.7 或更高版本,但应该也能与所有 3.6 及以上版本的 Python 顺利运行。软件包没有其他依赖项,仅使用标准库。
安装
要安装 tdt4160
,请运行
$ python3 -m pip install tdt4160
或者从源代码安装
$ python3 setup.py install
简介
由于 COVID-19,NTNU 的许多课程已经从无辅助设备的考试厅考试转变为允许使用所有辅助设备的家庭考试。我觉得如果有一个工具能帮你完成整个考试,那将会很有趣,现在你可以使用任何你想要的工具。
没错,这确实很有趣。
示例
伪汇编
# Dette eksempelet er fra Høsteksamen 2020, oppgave 6
from tdt4160.assembly import *
# Først, sett opp alle registre som det står i oppgaven
set_asm_registries(
R0=0xFFFF0000,
R7=0xFFFF0001,
R8=0xFFFF0002,
R9=0xFFFF0003,
)
# Så sett opp alle minneaddresser
set_asm_addresses({
0xFFFF0000: 0x00000001,
0xFFFF0001: 0x00000002,
0xFFFF0002: 0x00000003,
0xFFFF0003: 0x00000004,
0xFFFF0004: 0xFFFF0005
})
# Legg alle instruksjonene i kø for utførsel
assemble(0x0000FFFE, LOAD, R8, R0)
assemble(0x0000FFFF, MOVC, R7, 1)
assemble(0x00010000, ADD, R0, R0, R7)
assemble(0x00010001, LOAD, R9, R0)
assemble(0x00010002, MUL, R9, R8, R9)
assemble(0x00010003, ADD, R9, R9, R8)
assemble(0x00010004, ADD, R0, R0, R7)
assemble(0x00010005, LOAD, R8, R0)
assemble(0x00010006, ADD, R8, R9, R8)
# Kjør instruksjonene
execute_assembly(0x0000FFFE)
# Denne funksjonen printer alle registre som ble brukt i utførselen
# I dette tilfellet ser vi etter R8, som bør være 6
print_asm_regs()
代码会输出以下内容
=============================== MEMORY: 0000FFFE ===============================
INSTRUCTION: LOAD R8=FFFF0002, R0=FFFF0000
Loaded value 00000001 into R8 from address FFFF0000
=============================== MEMORY: 0000FFFF ===============================
INSTRUCTION: MOVC R7=FFFF0001, Constant=00000001
Moved value 00000001 into R7
=============================== MEMORY: 00010000 ===============================
INSTRUCTION: ADD R0=FFFF0000, R0=FFFF0000, R7=00000001
Added R0=FFFF0000+R7=00000001
Result FFFF0001 stored in R0
=============================== MEMORY: 00010001 ===============================
INSTRUCTION: LOAD R9=FFFF0003, R0=FFFF0001
Loaded value 00000002 into R9 from address FFFF0001
=============================== MEMORY: 00010002 ===============================
INSTRUCTION: MUL R9=00000002, R8=00000001, R9=00000002
Multiplied R8=00000001*R9=00000002
Result 00000002 stored in R9
=============================== MEMORY: 00010003 ===============================
INSTRUCTION: ADD R9=00000002, R9=00000002, R8=00000001
Added R9=00000002+R8=00000001
Result 00000003 stored in R9
=============================== MEMORY: 00010004 ===============================
INSTRUCTION: ADD R0=FFFF0001, R0=FFFF0001, R7=00000001
Added R0=FFFF0001+R7=00000001
Result FFFF0002 stored in R0
=============================== MEMORY: 00010005 ===============================
INSTRUCTION: LOAD R8=00000001, R0=FFFF0002
Loaded value 00000003 into R8 from address FFFF0002
=============================== MEMORY: 00010006 ===============================
INSTRUCTION: ADD R8=00000003, R9=00000003, R8=00000003
Added R9=00000003+R8=00000003
Result 00000006 stored in R8
================================================================================
R0 = 0xFFFF0002
R7 = 0x00000001
R8 = 0x00000006
R9 = 0x00000003
IJVM
# Dette eksempelet er fra Høsteksamen 2020, oppgave 4
from tdt4160.ijvm import *
# Sett opp registre som det står i oppgaven
set_ijvm_registries(
SP=0x10101010,
LV=0x30000000,
CPP=0x10000001,
TOS=0xFF000000,
OPC=0xABCDE000,
H=0x12345678,
MAR=0xA5A5A5A5,
MDR=0x5A5A5A5A,
PC=0x55AA55AA
)
# Skriv inn alle mikronstruksjonene
ijvm(0b000001000, 0b000001001, 0b000, 0b00010000, 0b100000000, 0b000, 0b1111)
ijvm(0b000001001, 0b000001011, 0b000, 0b00111001, 0b100000000, 0b000, 0b1100)
ijvm(0b000001010, 0b000010000, 0b001, 0b01011000, 0b010101010, 0b000, 0b0001)
ijvm(0b000001011, 0b000001100, 0b000, 0b00111100, 0b100000000, 0b000, 0b0101)
ijvm(0b000001100, 0b000000000, 0b000, 0b00111100, 0b000010000, 0b000, 0b0101)
ijvm(0b000001101, 0b000001110, 0b000, 0b00110010, 0b001000101, 0b100, 0b1000)
# Kjør instruksjonene
execute_ijvm(0b000001000)
# Skriv ut verdien til alle registrene etter at programmet har kjørt
# I dette tilfellet ser vi etter flere registre, plukk ut de du vil
print_all_ijvm()
这段代码会得到
======================= Instruction address: 0x000001000 =======================
next=0b000001001 JAM=0b000 ALU=0b00010000 C=0b100000000 Mem=0b000 B=0b1111
ALU is 0b010000, function: 0
Result of operation: 0x00000000
Final result: 0x00000000
C is 0b100000000
The following registries take the value of 0x00000000
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001001
======================= Instruction address: 0x000001001 =======================
next=0b000001011 JAM=0b000 ALU=0b00111001 C=0b100000000 Mem=0b000 B=0b1100
ALU is 0b111001, function: A + 1
A is always H=0x00000000
Result of operation: 0x00000001
Final result: 0x00000001
C is 0b100000000
The following registries take the value of 0x00000001
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001011
======================= Instruction address: 0x000001011 =======================
next=0b000001100 JAM=0b000 ALU=0b00111100 C=0b100000000 Mem=0b000 B=0b0101
ALU is 0b111100, function: A + B
A is always H=0x00000001
B is 0b0101 (5), yielding LV=0x30000000
Result of operation: 0x30000001
Final result: 0x30000001
C is 0b100000000
The following registries take the value of 0x30000001
H
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000001100
======================= Instruction address: 0x000001100 =======================
next=0b000000000 JAM=0b000 ALU=0b00111100 C=0b000010000 Mem=0b000 B=0b0101
ALU is 0b111100, function: A + B
A is always H=0x30000001
B is 0b0101 (5), yielding LV=0x30000000
Result of operation: 0x60000001
Final result: 0x60000001
C is 0b000010000
The following registries take the value of 0x60000001
LV
Mem is 0b000
Mem is 0, don't touch memory
Next instruction: 0b000000000
================================================================================
Next instruction is 0. We're done
SP = 0x10101010
LV = 0x60000001
CPP = 0x10000001
TOS = 0xFF000000
OPC = 0xABCDE000
H = 0x30000001
MAR = 0xA5A5A5A5
MDR = 0x5A5A5A5A
PC = 0x55AA55AA
MBR = 0xUNINITIALIZED
MBRU = 0xUNINITIALIZED
MPC = 0x00000000
请注意,两个寄存器从未被设置,无论是在配置中还是在代码中,因此它们只是 UNINITIALIZED
。只要它们没有被用于任何操作,这就可以了。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。