Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра «Електронні обчислювальні машини»
Лабораторна робота №4
“Робота з симулятором машини Ноймана. Дослідження виконання асемблерної програми симулятора”
з дисципліни:
“Архітектура комп’ютерів”
Львів – 2013
Мета: опанувати роботу асемблера на симуляторі машини Ноймана, зрозуміти і дослідити принцип виконання програми машиною Ноймана.
Завдання: Розширити архітектуру систему команд симулятора машини Ноймана, скласти програму на асемблері з розшириним набором команд, перетворити її у машинні коди, запустити симулятор, увести до нього коди машинних, проаналізувати і пояснити отримані результати, довести коректність роботи розширеного набору команд, скласти звіт з виконання лабораторних досліджень та захистити його.
12
Зсув циклічний вліво
Вмістиме файлу pr2.as:
lw 0 1 one
lw 0 2 two
lw 0 3 eight
str noop 2 1 2
beq 3 2 end
beq 0 0 str
end sw 0 2 res
halt
two .fill 4
one .fill 1
eight .fill 1
res .fill 0
Вмістиме файлу pr2.nc:
8454153
8519688
8585226
30474242
18481153
16842749
12713995
25165824
4
1
1
0
Вмістиме файлу rep.txt:
@@@
state:
pc 8
memory:
mem[ 0 ] 8454153
mem[ 1 ] 8519688
mem[ 2 ] 8585226
mem[ 3 ] 30474242
mem[ 4 ] 18481153
mem[ 5 ] 16842749
mem[ 6 ] 12713995
mem[ 7 ] 25165824
mem[ 8 ] 4
mem[ 9 ] 1
mem[ 10 ] 1
mem[ 11 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] 1
reg[ 2 ] 1
reg[ 3 ] 1
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
Файл
Старий код
Новий код
ssol.c
#define NOOP 7
#define ROL 7
else if (opcode == NOOP) {
}
else if (opcode == ROL) {
int x = state.reg[arg0];
int n = state.reg[arg1];
__asm{
mov cl, byte ptr n
rol x, cl}
state.reg[arg2] = x;
}
asol.c
#define NOOP 7
#define ROL 7
if (strcmp(opcode, "add") && strcmp(opcode, "nand") &&
strcmp(opcode, "lw") && strcmp(opcode, "sw") &&
strcmp(opcode, "beq") && strcmp(opcode, "jalr") &&
strcmp(opcode, "halt") && strcmp(opcode, "noop") &&
strcmp(opcode, ".fill")) {
printf("error: unrecognized opcode %s at address %d\n", opcode,
address);
exit(1);
}
if (strcmp(opcode, "add") && strcmp(opcode, "nand") &&
strcmp(opcode, "lw") && strcmp(opcode, "sw") &&
strcmp(opcode, "beq") && strcmp(opcode, "jalr") &&
strcmp(opcode, "halt") && strcmp(opcode, "rol") &&
strcmp(opcode, ".fill")) {
printf("error: unrecognized opcode %s at address %d\n", opcode,
address);
exit(1);
}
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
!strcmp(opcode, "beq") || !strcmp(opcode, "jalr")) {
testRegArg(arg0);
testRegArg(arg1);
}
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand")) {
testRegArg(arg2);
}
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "ror") ||
!strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
!strcmp(opcode, "beq") || !strcmp(opcode, "jalr")) {
testRegArg(arg0);
testRegArg(arg1);
}
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "rol")) {
testRegArg(arg2);
}
num = ( NOOP << 22 );
num = (ROL << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16)| atoi(arg2);
Висновок: я опанував роботу асемблера на симуляторі машини Ноймана, зрозумів і дослідив принцип виконання програми машиною Ноймана.