Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

Эмулятор троичного компьютера: стек

Ответить
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Эмулятор троичного компьютера: стек

Сообщение nezabudka »

Простенько и со вкусом. В качесве стека выбрала массив фиксированного размера.
В экспериментальном варианте для наглядности использовала целые числа вместо структуры.
В главной функции поочередно в стек ложим три целочисленных значения и так же поочередно
снимаем их со стека в обратном порядке как и требует алгоритм работы стека. Это только основа
которая будет в дальнейшем обрастать дополнительным кодом, например нужно будет
продумать изменение данных в регистре PS определяющим вершину стека, я склонна полагать
что раз адреса стека находятся вне адресного пространства то и стек PS можно организовать
как флаг из целого числа, а не структуры трайта и оставить так как есть в коде в виде глобальной
переменной во втором поле структуры стека.
[spoiler]

Код: Выделить всё

/* Надо написать еще две функции call и ret
 * которые будут использовать pop и push
 * и в конечном варианте надо подставить
 * вместо данных определенную ранее структуру трайта.
 */
#include <stdio.h>
#include <stdlib.h>
#define STACK_S 10

typedef struct stack_t {
	unsigned short data[STACK_S];
	unsigned short size;
} Stack_t;

Stack_t stack;

void push(unsigned short value) {
	if (stack.size == STACK_S)
		exit(1);
	stack.data[stack.size] = value;
	stack.size++;
}

int pop() {
	if (stack.size == 0)
		exit(1);
	stack.size--;
	return stack.data[stack.size];
}

int main(void) {
	unsigned short digit1 = 1;
	unsigned short digit2 = 2;
	unsigned short digit3 = 5;
	push(digit1);
	push(digit2);
	push(digit3);
	printf("%hu\n", pop());
	printf("%hu\n", pop());
	printf("%hu\n", pop());
	return 0;
}
[/spoiler]
Пошла коммитить
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Ответить

Вернуться в «C/C++»