Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: i8080/8085/KP580
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/58: Рейтинг темы: голосов - 58, средняя оценка - 4.97
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
1

Все кому интересно, что такое CompModel, сюда.

06.06.2011, 08:26. Просмотров 11774. Ответов 13
Метки нет (Все метки)

Может кто помнит, на днях у одного из обратившихся за помощью людей, была тема
"програмирование на CompModel(TheFaster)".
Я попытался помочь, решить поставленную задачу. А на пометку "CompModel" не обратил
внимания, подумал, если форум ASM, то и писать на ASM.
После того как прога была готова, я её выложил в теме, ОКАЗАЛОСЬ совсем не то, что нужно
(ВОТ ЛАЖА).

Ну короче решил посмотреть что за "CompModel" такой. Что самое интересное в NETe,
практически ничего не нашёл, за исключением:
.самой программы, которая находилась на этом форуме.
.ссылок(старых) на архивы, которые были давно удалены.(т.е. толку 0)
.один исходник (недоделка, но хоть что-то).

НУ ПО КРАЙНЕЙ МЕРЕ, МОЖЕТЕ САМИ ПОИСКАТЬ.
(ЕСЛИ Я ВСЁ ТАКИ ЧТО-ТО ПРОПУСТИЛ, ТО ПОЖАЛУЙСТА ВЫЛОЖИТЕ В ЭТОЙ ТЕМЕ.)
Т.к. информации об используемых командах и операциях не было найдено, решил
попробовать, разобраться сам и начать данный материал. Возможно кто-то из вас его
продолжит.

Попросил TheFaster поискать какие-нибудь лабы(для разбора), и он нашёл парочку,
в том числе и свою.

Ладно хватит пустого 'пальцеотбивания', перейду к делу:

CompModel - это типа эмулятор работы процессора, монитора и клавиатуры(как я понял).
Если сравнить с ASM - это намного более урезанный и облегчённый язык,возможно автор
хотел создать что-то типа "Начальная ступень перед изучением ASSEMBLERa".

По ходу разбора лаб, было составлено описание команд, если где то партаки и корявости
(не в смысле орфографии), просьба поправить или дополнить(может кому-то пригодится).

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Примечание: 
 Здесь и далее, под АЛУ подразумеваю поле Асс, в которое выводится его состояние.
 Это регистр - ч/з который происходят все операции.
 
;РАБОТА С АЛУ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    RD  #101      ;загрузить число (до 999) в АЛУ
    RDI #10450    ; загрузить число (до 999999) в АЛУ
    
    WR  R1        ;из АЛУ в регистр (R1),  число (до 999)
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ПОДПРОГРАММЫ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CALL -  ;вызов подпрограммы.
RET  -  ;возврат из подпрограммы (в точку вызова).
IRET -  ???
;ПРИМЕР:
        ...
        call PROG
        ...
    
    PORG:
        ...
        ret
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;РАБОТА СО СТЭКОМ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PUSH -  ;поместить в стек            операнд: регистр (R1)
POP  -  ;вытолкнуть из стека        операнд: регистр (R1)
;Операндом назначается только регистр
   WRRB - ;изменение указателя на дно стэка                           ;операнд: число (#10), ячейка памяти (10)
   WRSP - ;изменение указателя на верхушку стэка                ;операнд: число (#10), ячейка памяти (10) 
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ВОЗМОЖНЫЕ ОПЕРАНДЫ///////////////////////////////////////////////////////////////////////////////////////////////////////////
;регистры: R0,R1,R2,R3,R4,R5,R6,R7,R8,R9.
     RD R1    ;чтение из регистра R1, значения в АЛУ 
     WR R1    ;запись в регистр R1, значения из АЛУ
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;поместить значение в АЛУ
     RD #176  ;записать в АЛУ число 176
     WR #4    ;результат операции не был замечен, хотя 
              ;за ошибку данная запись не принята.
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;обращение к памяти 
     RD 10    ;чтение из 10 ячейки памяти, в АЛУ
     WR 10    ;запись в 10 ячейку памяти, из АЛУ
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;обращение к памяти  (не знаю как обозначить,  - "двойной адрес".)
;по указанному адресу, будет получено значение, 
;(000*** - помеченное звёздочкой)
;которое будет воспринято как адрес из которого и будет получено конечное значение.
     RD @10  ;чтение
     WR @10  ;запить
;Думаю на примере самомодификации, будет проще
;объяснить, её суть.
;в программе устанавливаем остановку по 5 адресу
;на самом деле она произойдёт на 10 (для демонстрации выбран простейший пример)
адр  операция  код опер  ;описание
0.   RD #900   211900    ;код выхода 090000
1.   MULI #10  251010    ;здесь одновременно умножаем 900*10 и указываем адрес по которому произойдёт выход - 10
2.   MUL #10   251010    ;ещё раз *10
3.   WR @1     222001    ;запишем из АЛУ (090000), по адресу находящемуся в 1 ячейке - 10
4.   JMP 10    100010    ;переход на 10 адрес
5.   HLT       090000    ;выход, который не сработает
6.   NOP       000000
7.   NOP       000000
8.   NOP       000000
9.   NOP       000000
10.  JMP 5     100005    ;здесь будет замена JMP на HLT
11.  NOP       000000
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ//////////////////////////////////////////////////////////////////////////////////////////////////////
ADD  -  ;сложение     (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
ADI  -  ;сложение     (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
SUB  -  ;вычитание   (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
ASI  -  ;вычитание   (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
MUL  -  ;умножение   (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
MULI -  ;умножение   (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10). 
DIV  -  ;деление        (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
DIVI -  ;деление        (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
;эти операции работают по единому принципу
   RD #65        ;поместим в АЛУ число 
   ADI #878932   ;добавить к загруженному ранее числу
                 ;результат в АЛУ
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;УСЛОВНЫЕ И БЕЗУСЛОВНЫЕ ПЕРЕОДЫ , ЦИКЛЫ/////////////////////////////////////////////////////////////////////////////////////
;Операции сравнения(типа CMP), пока не обнаружено.
;Для возведения флагов используются арифметические операции
;Возможные переходы описаны ниже
JZ       -    ; z = 1   (X == Y)
JNZ      -    ; z = 0   (X != Y)
JS       -    ; s = 1   (X <  Y)
JNS      -    ; s = 0   (X >= Y)
JO       -    ; o = 1   (X >  Y)
JNO      -    ; o = 0   (X <= Y)
JMP      -    ; безусловный
;ПРИМЕР:
;операндом перехода может быть:
;метка
   JMP LABEL
   ....
LABEL:   
;или адрес (возможно есть и др. варианты)
   JMP 10   
;----------JRNZ переход, (аналог LOOP, только по работе)------------------------------------------------------------------------------------------------------
   RD #5      ;будет 5 проходов по циклу
   WR R1      ;загрузим в регистр R1
M1:
   ...
   ...
   JRNZ R1,M1 ;сразу после запятой должна быть указана метка(SPACE после [,] использовать нельзя, ОШИБКА)
;Значение указанного регистра будет понижаться автоматически на 1, пока не достигнет 0
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;РАБОТА С ПОРТАМИ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IN   -  ;из порта в АЛУ.
OUT  -  ;из АЛУ в порт.
     
;Известные на данный момент команды
;Команда очистки буфера
     RDI #101   
     OUT 1      ;для клавиатуры
     OUT 11     ;и дисплея
     
;Команда сброса ошибки
     RDI #102
     OUT 1      ;для клавиатуры
     OUT 11     ;и для дисплея
     
;Команда разрешения МВУ
     RDI #10    
     OUT 1      ;для клавиатуры без прерываний (по опросу)
     OUT 11     ;для монитора без авто увеличения адреса
     
;Вывод данных в определённую ячейку экрана
    RD #65      ;указатель на ячейку, экрана
    OUT 13      ;передаём в порт адрес ячейки
    RD R5       ;из регистра R5 в АЛУ
    OUT 10      ;вывести на экран символ находящийся в АЛУ
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ДРУГИЕ КОМАНДЫ И ОПЕРАЦИИ////////////////////////////////////////////////////////////////////////////////////////////////////
;БЕЗ ОПЕРАНДОВ
   NOP  -  ;пустышка
   HLT  -  ;остановить программу (выход)
; С ОПЕРАНДАМИ
   MOV R1,R2 ;загрузить значение из регистра R2 в R1          ;операнд: регистр
   INT - вызов прерывания??? ;операнд: число(1)   
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
P.S.: Мне в принципе программа понравилась, можно потыкать.
(если б к программе приложение было, в виде HELPa, то затраты по времени, на её освоение были бы минимальны).
5
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2011, 08:26
Ответы с готовыми решениями:

Бинарные деревья ! кому интересно , сюда!;)
задание : Описать процедуру или функцию которая : а) печатает запись, встречающуюся в дереве один...

Кто хочет знать: что такое COM: сюда
Вот ссылка на лучшую &quot;на мой взгляд&quot; книгу по технологии COM: В этой книге изложены все основные...

Интересно, DELIMETERS - что такое?
задача читает строку, разбивая ее на строки, используется разбиение строки, типа как флаг, но...

Вот интересно: Что же такое поток?
Мы часто используем cout&lt;&lt;;cin&gt;&gt;;scanf();printf(); но Себя впоймал на мысле, что же такое...

Если Вы знаете, что такое полиморфный генератор -- Вам сюда! Пожалуйста!
Приветствую! Собственно вопрос в теме. Я тут начал разбираться в ассемблере и вспомнил слова,...

13
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
06.06.2011, 08:31  [ТС] 2
Сама программа CompModel и пока 2 программы для неё.

Позже будет ещё одна программа, с которой, я как раз таки обложался.
1
Вложения
Тип файла: rar PROG.rar (1.4 Кб, 349 просмотров)
Тип файла: zip CompModel-2K.zip (245.4 Кб, 296 просмотров)
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
06.06.2011, 09:06  [ТС] 3
Да и ещё, у кого будут вопросы, обращайтесь. Постараюсь помочь.
1
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
07.06.2011, 19:46  [ТС] 4
Селективный ввод символов с клавиатуры.Используемые внешнии устройства это клавиатура и дисплей.
Все русские буквы встречающиеся в строке ввода -в верхнию часть экрана дисплея(строки 1-4),все цифры-в нижнию часть экрана (строки 5-8),остальные символы не ввыводить.
1
Вложения
Тип файла: rar INPUT.rar (1.0 Кб, 256 просмотров)
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
19.06.2011, 16:56 5
zzzyyyxxx, не были бы Вы так добры помочь с задачей для compmodel.
Нужно очистить буфер клавиатуры после ввода 35 символов. Вроде програмка простая, но училка не примеров ничего не дала, и я понятия не имею как это сделать... Помогите пожалуйста.
0
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
19.06.2011, 18:00  [ТС] 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от DimaGerrard Посмотреть сообщение
Очистить буфер клавиатуры после ввода 35 символов.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
;инициализация
RDI #101                      ;Команда очистки буфера
OUT 1                           ;для клавиатуры
OUT 11                         ;и дисплея
 
RDI #102                      ;Команда сброса ошибки
OUT 1                           ;для клавиатуры
OUT 11                         ;и для дисплея
 
RDI #10                        ;Команда разрешения МВУ
OUT 1                           ;для клавиатуры без прерываний (по опросу)
OUT 11                         ;для монитора без автоувеличения адреса
 
;по заданию
INPUT:
   IN 0                           ;получим из буфера код последней клавиши
   JZ INPUT                ;если буфер пуст, то далее по циклу
   
   OUT 10                    ;на экран последнюю клавишу
    RD R1                     ;здесь, получение индекса ячейки
    ADD #1                   ;увеличим на 1
    WR R1                    ;сохраним в R1
    OUT 13                   ;в порт новое значение
  
   RD R0                     ;в R0 храним кол-во введ символов
   ADD #1                   ;увеличим на 1
   WR R0                    ;сохраним
   SBI 35                     ;------------------------проверим, достигло ли оно разрешённого кол-ва(50)
   JNZ INPUT            ;если нет то по циклу
          RD #0              ;иначе обнулим
          WR R0
          RDI #101        ;и очистим буфер
          OUT 1
          JMP INPUT   ;по бесконечному циклу
3
Юлия1
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 6
07.12.2011, 17:52 7
Добры вечер. Не могли бы Вы мне помочь в решении одной непростой задачки?
Вывод содержимого заданного участка памяти на дисплей посимвольно с заданным промежутком времени между выводами символов.
Используемые ВУ: дисплей, таймер.
Пояснения: Остаток от деления на 256 трех младших разрядов ячейки памяти рассматривается как ASCII-код символа. Начальный адрес памяти, длина массива вывода и промежуток времени — параметры подпрограммы.
1
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
08.12.2011, 15:46  [ТС] 8
так вроде, там с временем понт, я не знаю сколько надо задать для 1ой сек, но я думаю ты разберёшся
и [Остаток от деления...] сам(а) доделаешь, у мну ща своих дел по горло.
... а параметры в процедуру передаём ч/з регистры...
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;Вывод содержимого заданного участка памяти на дисплей посимвольно с заданным промежутком времени между выводами символов. 
;Используемые ВУ: дисплей, таймер.
;Пояснения: Остаток от деления на 256 трех младших разрядов ячейки памяти рассматривается как 
;ASCII-код символа. Начальный адрес памяти, длина массива вывода и промежуток
;времени — параметры подпрограммы.
 
 
;инициализация
          RDI #101                      ;Команда очистки буфера
          OUT 1                           ;для клавиатуры
          OUT 11                         ;и дисплея
 
          RDI #102                      ;Команда сброса ошибки
          OUT 1                           ;для клавиатуры
          OUT 11                         ;и для дисплея
 
          RDI #10                        ;Команда разрешения МВУ
          OUT 1                           ;для клавиатуры без прерываний (по опросу)
          OUT 11                         ;для монитора без автоувеличения адреса
 
          RDI #1011                   ;вкл 1 таймера
          OUT 22
          RDI #0                         ;сброс таймера
          OUT 21
 
 
          
          RD #100                     ;начальная ячейка
          WR R1
          RD #5                         ;кол-во символов
          WR R2
          RD #100                     ;промежуток времени
          WR R3
          call ADBCD
         
HLT 
NOP
NOP
NOP
 
 
ADBCD:
          RD #0                          ;для вывода на экран c нулевой позиции
          WR R0
n1:
          ;смена позиции
          RD R0
          OUT 13
          ADD #1
          WR R0
 
          ;на экран
          RD @R1
          OUT 10
          RD R1
          ADD #1                       ;на след ячейку
          WR R1
 
          RDI #0                         ;сброс таймера
          OUT 21          
new:
          IN 21
          SUB R3
          JS new 
          
          RD R2                        ;проверка по циклу
          SUB #1
          WR R2
          JNZ n1
                
          
          ret
NOP
NOP
NOP
2
Юлия1
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 6
08.12.2011, 17:53 9
Спасибо Вам большое, но, если честно, вряд ли разберусь. В Ассемблере я полный 0.
0
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
08.12.2011, 18:10  [ТС] 10
первый пост, там расписаны команды(могут быть неточности),
а по поводу "я полный ноль", то все мы были когда-то нулями, надо же начинать исправлятся,
да и когда свою специальность выбирала, знала же на что идёшь?

P.S.: мне хватило несколько дней чтоб врубится(ну не супер конечно но хоть как-нибудь), а с ассемблером(на мой взгляд) здесь связи мало...
0
Юлия1
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 6
09.12.2011, 09:07 11
Полностью с вами согласна, что надо начинать. И спасибо огромное за помощь.
0
Рената_З
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 1
13.12.2011, 13:34 12
не могли бы вы помочь с решением задач?
1.Вывод на дисплей одного из трех текстовых сообщений, в зависимо-сти от нажатой клавиши. <1> — вывод на дисплей первого тек¬стового сообщения, <2> — второго, <3> — третьего, остальные символы — нет реакции.
2. Вывод на дисплей содержимого группы ячеек памяти в числовой форме (адрес и длина группы — параметры подпрограммы). Содержимое ячейки распаковывается (с учетом знака), каждая цифра преоб¬разуется в соответствующий ASCII-код и выдается на дисплей. При переходе к выводу содержимого очередной ячейки формируется задержка 10 с.
0
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
13.12.2011, 14:41  [ТС] 13
1) как описываются данные в программе я не в курсе, если есть примерчик скинь, а
если не имеешь, то вот набросал, программа вывдит данные из [1]100 ячейки, [2]200, [3]300.
если что, сменишь адреса ячеек на адрес строки(строка должна заканчиваться [.])

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
;ГЁГ*èöèГ*ëèçГ*öèÿ
          RDI #101
          OUT 1 
          OUT 11
 
          RDI #102
          OUT 1
          OUT 11
 
          RDI #10
          OUT 1
          OUT 11
 
          RD #0
WAIT:     IN 0
          JZ WAIT
          WR R1
          SUB #49
          JZ NNN1
          RD R1
          SUB #50
          JZ NNN2
          RD R1
          SUB #51
          JNZ WAIT
                    RD #300
                    WR R0
                    JMP NXT
                           
NNN1:               RD #100
                    WR R0
                    JMP NXT
                    
NNN2:               RD #200
                    WR R0
NXT:      RD @R0
          OUT 10
          SUB #46
          JZ GO 
          RD R0
          ADD #1
          WR R0
          RD R2
          ADD #1
          WR R2
          OUT 13
          JMP NXT
GO:
HLT 
NOP
NOP
NOP

2) пост №8 задание такое же. время подгонишь и выводит она не число, а символ соотв этому числу....
1
Goodwin98
13.12.2011, 15:25     Все кому интересно, что такое CompModel, сюда.
  #14
 Комментарий модератора 
Один вопрос - одна тема. Закрыто
0
13.12.2011, 15:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2011, 15:25
Привет! Вот еще темы с ответами:

Кому легко, сюда
Здравствуйте, помогите пожалуйста написать программу.Вот условие задачи: Дано натуральное число n....

Что делает данный код и зачем такое кому-нибудь может понадобиться?
Я ответил на вопрос,но точной формулировки не нашёл,хотел бы свериться(приложения с ответами...

Кому интересно. Покер
Вообщем, давно ничего не кодил и на днях накатал немного говно кода на тему Покера. Кому будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru