Виртуальный процессор над битовыми строками |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Виртуальный процессор над битовыми строками |
NoRToN |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 18 Пол: Мужской Репутация: 0 |
Разработать виртуальный процессор для логических операций над битовыми строками.
Система команд – логические операции над содержимым 32-разрядных регистров , ввод и вывод содержимого регистров в шестнадцатеричной форме , считывание содержимого регистра в выделенный регистр (сумматор) и запись в регистр содержимого сумматора. Команды записываются в мнемонической форме с указанием имени регистра , в котором содержится один из операндов , второй операнд берётся из сумматора. Результат операции записывается в сумматор. Дать описание системы команд и программу для вычисления значений булевской функции. ПОМОГИТЕ. Заранее спасибо |
Altair |
Сообщение
#2
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
То есть вы просите написать всю систему??
Если есть конекретные вопросы, тогда другое дело ... 1. требуется определить чем будем эмулировать регистры (не забываем что 32 разрядние - то есть 4 байта... можно использовать как регистр число типа LONGINT)... 2. ввод чисел в шестнадцатиричное СС - в FAQ'е есть процедура для конвертирования. То есть вводим в 16. а работаем в 10. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
NoRToN |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 18 Пол: Мужской Репутация: 0 |
Просто я не представляю ,что эта программа должна делать. Пример хотя бы.
Добавлено позже: Я могу решать только простые задачи. А это задача не по мне... Помогите мне с решением |
Altair |
Сообщение
#4
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата Просто я не представляю ,что эта программа должна делать. Пример хотя бы. Она должна эмулировать работу процессора. напрмер ввожу я 2 чсила. И она показывает в какие регистры что помещает, и как вычисляет пошагово - все это должно быть визуализированно. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
Сообщение
#5
|
Гость |
NoRToN
Значит, так: вот набросок виртуального процессора. Это чтобы было понятно, чего от тебя хотят, и как вообще это делать... Система команд: Цитата in <#> <значение> - заслать <значение> в регистр <#> out <#> - показ значения регистра <регистр#> mov <#> - переслать содержимое регистра <#> в сумматор reg <#> - переслать содержимое сумматора в регистр <#> and <#> - операция AND между значениями сумматора и регистра <#> Результат - в сумматоре or <#> - операция OR между значениями сумматора и регистра <#> Результат - в сумматоре xor <#> - операция XOR между значениями сумматора и регистра <#> Результат - в сумматоре halt - останов процессора (выход из программы) "Процессор" расчитан на 10 регистров... Вот сама программа. Если есть баги - сильно не ругаться, посмотри на время поста... ;) Код uses crt; const n = 10; alu = succ(n); rgs: array[1 .. n+1] of longint = {начальные значения - для отладки...} (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0); type TWords = (rwError, rwIn, rwOut, rwMov, rwReg, rwAnd, rwOr, rwXor, rwHalt); const words: array[TWords] of string = ('', 'in', 'out', 'mov', 'reg', 'and', 'or', 'xor', 'halt'); letter: array[boolean] of char = ('0', '1'); procedure print_reg(i: integer); var x: longint; begin x := rgs[i]; for i := 0 to 31 do write( letter[((x shl i) and $80000000) = $80000000] ); end; procedure show_cpu; var i: integer; begin for i := 1 to n do begin gotoxy(1, i); write('reg(', i, '):'); gotoxy(20, i); print_reg(i) end; gotoxy(1, n+3); write('sum: '); gotoxy(20, n+3); print_reg(n+1); end; function get_command: boolean; procedure print_error; begin gotoxy(1, n+5); write('>> ILLEGAL INSTRUCTION <Enter>'); readln end; function find_word(s: string): TWords; var i: TWords; begin for i := succ(low(TWords)) to high(TWords) do if s = words[i] then begin find_word := i; exit end; find_word := rwError end; function next_token(s: string; var x: longint; max: longint): boolean; var err: integer; begin next_token := false; if s = '' then exit; while s[1] = ' ' do delete(s, 1, 1); val(s, x, err); next_token := ((err <> 0) or (x <= 0) or (x > max)) end; var s, s_oper: string; p: byte; found: TWords; value, data: longint; begin gotoxy(1, n+5); write('':55); gotoxy(1, n+5); write('>'); readln(s); p := pos(' ', s); if p > 0 then begin s_oper := copy(s, 1, pred(p)); delete(s, 1, p) end else s_oper := s; get_command := false; found := find_word(s_oper); case found of rwOut .. rwXor: begin if next_token({copy(s, 1, pred(pos(' ', s)))}s, value, n) then print_error {error occured} else begin case found of rwOut: begin gotoxy(1, n+5); write('>> reg(', value, ') = ', rgs[value], ' <Enter>'); readln end; rwMov: rgs[alu] := rgs[value]; rwReg: rgs[value] := rgs[alu]; rwAnd: rgs[alu] := rgs[alu] and rgs[value]; rwOr: rgs[alu] := rgs[alu] or rgs[value]; rwXor: rgs[alu] := rgs[alu] xor rgs[value]; end; get_command := false; exit end; end; rwIn: begin if next_token(copy(s, 1, pred(pos(' ', s))), value, n) then print_error {error occured} else begin delete(s, 1, pos(' ', s)); if next_token(s, data, maxlongint) then print_error {error occured} else begin rgs[value] := data; get_command := false; exit end; end; end; rwHalt: get_command := true; else print_error {error occured} end; end; var stopped: boolean; begin clrscr; stopped := false; repeat show_cpu; stopped := get_command; until stopped; end. |
NoRToN |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 18 Пол: Мужской Репутация: 0 |
А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе)
А тут, чтобы коэффициенты матрицы вводились с клавиатуры censored Сообщение отредактировано: volvo - |
volvo |
Сообщение
#7
|
Гость |
NoRToN
Цитата А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе) Ввод осуществляется в строку, найди, где она преобразуется в число и делай, что тебе надо... Только зачем? Ты что, сможешь контролировать результат в 16-ой системе? А вот второй вопрос к этой теме не относится... Спрашивай там, где программа была написана... |
NoRToN |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 18 Пол: Мужской Репутация: 0 |
хорошо. Просто по заданию надо в 16 форме , а у мен яне получилось переделать
|
lidok |
Сообщение
#9
|
Гость |
как сделать с сумматором я знаю, а как с 3 регистрами - нет. И что такое условный, безусловный переходы и мнемоническая форма??
|
volvo |
Сообщение
#10
|
Гость |
lidok
Если человек знает, как сделать с сумматором, то для 3-х регистров переделать - для него не проблема ... Тем более, что сумматор ведь тоже регистр ... |
lidok |
Сообщение
#11
|
Гость |
И как это сделать?? Ты знаешь??
Сообщение отредактировано: lidok - |
1nvaL |
Сообщение
#12
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Спасибо за этот пример! Вобщем мне сказали вот что:
текст программы в машинных кодах должен считываться из отдельного текстового файла. Ты не мог бы помоч мне это сделать??? |
Гость |
Сообщение
#13
|
Гость |
Приведите пример программы к етому процессору =)
|
Текстовая версия | 8.10.2024 22:09 |