Форум программистов, компьютерный форум, киберфорум
Assembler: i8080/8085/KP580
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
14 / 1 / 0
Регистрация: 13.01.2017
Сообщений: 45

[КР580] Написать программу вычисления функции

11.06.2018, 19:47. Показов 3033. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С ассемблером сталкиваюсь впервые, но хотел бы кое что уточнить. По заданию тип микропроцессора Кр580BM80. И есть специальные требования , минимизировать объем памяти, занимаемый программой.
Я так понимаю, это нужно упростить функцию вручную, или все же можно ее записать сразу,в виде кода ? Вот пример функции. Объясните, если не затруднит

Вот пример Функции
https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\frac{(x_1+x_2)^3}{x_1}
Не совсем понимаю, как в 3 степени записать
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2018, 19:47
Ответы с готовыми решениями:

Написать программу для эмулятора КР580
Логически сложить два двухбайтных числа 042D и 624A. Из старшего байта полученного числа вычесть младший байт и...

Написать программу на кр580 (сравнение чисел)
Нужно разработать алгоритм и по нему написать программу для кр 580 Задача. В памяти записан массив из 12-ти однобайтных чисел....

(КР580) Написать программу, осуществляющую вывод на 1 и 2 индикаторы
Добрый день! Помогите с решением задачи: Написать программу, осуществляющую вывод на 1 и 2 индикаторы заданной бесконечной...

11
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
11.06.2018, 20:25
x3mSmile, 2 раза умножить. Правда, Кр580BM80 не умеет умножать (и уж тем более - делить), поэтому под минимизацией памяти, видимо, имеется ввиду написание отдельной подпрограммы умножения, чтобы её вызвать 2 раза.
3
14 / 1 / 0
Регистрация: 13.01.2017
Сообщений: 45
11.06.2018, 21:03  [ТС]
По поводу вот возведения в корень, уже разобрался и все понятно, спасибо. А как можно сделать это, какими командами пользоваться, чтобы написать эту подпрограмму ? Я так понимаю какой-то цикл это будет ?
Я сейчас изучаю команды этого микропроцессора и только вот после сообщения заметил, что там действительно нет умножения с делением
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
11.06.2018, 21:44
Цитата Сообщение от x3mSmile Посмотреть сообщение
Я так понимаю какой-то цикл это будет ?
Тут уже вам надо изучать не команды, а стандартные алгоритмы умножения/деления через сложения/вычитания/сдвиги. Они есть, например, в 3 томе книги А.В.Фрунзе "Микроконтроллеры - это же просто!", правда для 8051, но переделать под ваш процессор никакого труда не составит. Ну и для начала бы надо определиться с размером/знаковостью операндов и размером результата, т.к. в общем случае по этой формуле он может превысить размер операндов в 4 раза.
2
14 / 1 / 0
Регистрация: 13.01.2017
Сообщений: 45
12.06.2018, 17:58  [ТС]
Как то вот так у меня получилась эта функция и наверняка неверно, потому что я путаюсь в регистрах, помогите исправить или укажите на ошибки, где не так, а то уже всю голову сломал

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
VAR X1,X2,X3:BYTE;
F:WORD;
BEGIN
READLN(X1,X2,X3);
F:=(X1+X2),3 DIV X3;
WRITELN(F);
ASM
MUL16:
   MOV C,L
   MOV B,H
   MOV D,E
   LXI L,X1
   LXI L,X2
   LXI H,X3
   MVI A,15
   ADD C
MLP:
   PUSH PSW
   ORA D
   JR MLP1
   DAD C
MLP1:
   DAD L
   XCHG
   DAD L
   XCHG
   POP PSW
   DCR A
   JNZ MLP
   ORA , D
   RP
   DAD B
DIL:
    MOV A,H
    STA SCREM
    XRA D
    STA SQUOT
    MOV A,D
    ORA A
    JP CHKDE
    SUB A
    SUB E
    MOV E,A
    SBB A
    SUB D
    MOV D,A
Добавлено через 41 минуту
Или вот второй вариант, что получилось

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
VAR X1,X2,X3:BYTE;
F:WORD;
BEGIN
READLN(X1,X2,X3);
F:=(X1+X2),3 DIV X3;
WRITELN(F);
ASM
ORG 100h
    LXI E,X1
    LXI E,X2
    ADD E
    SHLD 300H
    MVI A,E
    STA 302H
    LXI H,X3
    SHLD 303H
 
    LHLD 300H
    XCHG
    LDA 302H
    CALL MNZ
    SHLD 309H   
    
 
    XCHG
    LHLD 303H
    CALL DC
    LXI B,0H
    CALL DIL
    MOV H,B
    MOV L,C
    SHLD 30BH
    
    XCHG
    LHLD 309H
    CALL DC
    CALL DODVD
    SHLD 30CH
    
    XCHG
    LHLD 307H
    CALL DODVD
    SHLD 30EH
    
    NOP
HLT
 
MNZ:                                 
    LOOP2:
        DAD D
        DCR A
        JNZ LOOP2
RET
 
DIL:                                     
    LOOP:
        DAD D
        INX B
        JC LOOP
        DCX B
RET
 
DC:
    MOV A,E
    CMA
    ADI 1
    MOV E,A
    MOV A,D
    CMA
    MOV D,A
    MVI A,0
    ACI 0
RET
 
DODVD:                         
    DAD D
RET
END
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
12.06.2018, 19:44
x3mSmile, вы уж извините, но ковыряться в ассемблерной программе без единого комментария, которая делает неизвестно что, желания чуть меньше, чем ноль. У вас должна получиться функция, которая принимает 2 аргумента, скажем в регистры B и C, и возвращает результат, допустим в A. Но это самый простейший случай для ОЧЕНЬ маленьких чисел, во всех остальных будет переполнение. Я же сказал - для начала надо определиться с размером и знаковостью операндов и результата.
1
14 / 1 / 0
Регистрация: 13.01.2017
Сообщений: 45
13.06.2018, 00:48  [ТС]
как то вот так получается, но в регистрах я реально запутался и точно намудрил что-то
тяжело воспринимать этот микропроцессор и писать на нём
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
ASM
ORG 100h      100H байт перед запущенным кодом резервируется;
    LXI E, X1      Загрузка данных;    
    LXI E, X2
    ADD E          Сложение;
    SHLD 300H      Сдвиг;
    MVI A, E       Передача данных;
    STA 302H       Содержимое А передается в ячейку памяти;
    
LXI H, X3
    SHLD 303H
LHLD 300H        Команда перехода;
    XCHG         Команда пересылки;
    LDA 302H     Загрузить А содержимое ячейки памяти;
    CALL MNZ     Вызвать подпрограмму умножения;
    SHLD 309H    
    
 
    XCHG
    LHLD 303H
    CALL DC
    LXI B, 0H
    CALL DIL
    MOV H, B
    MOV L, C
    SHLD 30BH
    
    XCHG
    LHLD 309H
    CALL DC
    CALL DODVD
    SHLD 30CH
    
    XCHG
    LHLD 307H
    CALL DODVD
    SHLD 30EH
    
    NOP        Команда для задержки;
HLT            Остановка процессора;
 
MNZ:           Умножение;                        
    LOOP2:
        DAD D       Содержимое DE сложить с HL;
        DCR A       Уменьшить значение в регистре А на 1;
        JNZ LOOP2   Метка;
RET                 Возврат из подпрограммы;
 
DIL:                 Деление;                    
    LOOP:
        DAD D
        INX B        Увеличить значение в паре регистров BC на 1;
        JC LOOP
        DCX B       Уменьшить значение в паре регистров BC на 1;
RET
 
DC:
    MOV A, E
    CMA               Инвертировать регистр А;
    ADI 1
    MOV E, A
    MOV A, D
    CMA
    MOV D, A
    MVI A, 0
    ACI 0
RET
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
13.06.2018, 10:38
x3mSmile, ну вы можете нормально ответить на мои вопросы:
1) какие размеры операндов используются?
2) что передаётся в функцию умножения и что она возвращает в качестве результата? Какой размер и знаковость этого хозяйства?
Неужели так сложно?
Ну и за алгоритм замены умножения просто циклом сложений вас по головке не погладят, нормальный алгоритм - это двоичное умножение сдвигами.

Не по теме:

А потом ещё деление делать...

1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
13.06.2018, 10:52
Kukuxumushu,
https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\frac{(x_{1}+x_{2})^3}{x_{1}}=x_{1}^2+3\cdot x_{1}x_{2}+3\cdot x_{2}^2+\frac{x_{2}^3}{x_{1}}
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
13.06.2018, 11:27
Mikl___, а смысл? Теперь вместо двух умножений их стало 8, а деление никуда не делось.
0
14 / 1 / 0
Регистрация: 13.01.2017
Сообщений: 45
13.06.2018, 13:04  [ТС]
Операнды, целые, положительные, 2-х байтовые, двоичные
Да, мне тяжело ответить на эти вопросы
Потому что на ассемблере опыта раньше не было никогда, а тем более на таком микропроцессоре старом
В функцию умножения передается сумма регистра E( X1 , X2)
В качестве результата возвращает умножение, но получается, что это будет в степени 2
А по поводу алгоритма, я не понимаю как сделать, а если и понимаю, то сбиваюсь и путаюсь в регистрах, пока данные вносятся, сохраняются, возвращаются, выносятся
Я понимаю код , но реализовать его тяжело
Но в любом случае спасибо
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
13.06.2018, 13:24
x3mSmile, в вашем случае я бы реализовал следующие функции:
1) умножение 2 байта на 2 с получением 4-байтового результата, который замещает операнды ("склеиванием" регистров)
2) деление 4 байта на 1 с результатом, который замещает делимое
В таком случае переполнение не возникнет никогда. Но это только моё субъективное мнение, вы можете реализовывать как-то по-другому. Для начала вам наверное надо реализовать функции сложения и вычитания 4-байтовых чисел, они потом пригодятся для умножения и деления. В любом случае это программа совсем не начального уровня, "топорными" методами вроде тех, что вы предложили в своём коде, с ней не справиться, и готовые коды к ней тут вам писать вряд ли кто-то будет.

P.S. А нет, всё-таки возникнет переполнение, если сумма очень большая, то её квадрат не влезет в 2 байта. Тогда можно умножение 3 на 2 сделать, результат по-прежнему всегда будет укладываться в 4 байта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2018, 13:24
Помогаю со студенческими работами здесь

Написать программу вычисления функции y= (x1+x2*x3)*16
народ помогите кто нибуть разобратся, а то совсем, что то не получается... нужно написать на асме программу вычисления функции y=...

Написать программу вычисления функции
Здравствуйте помогите написать программку на ассемблер. функция : y=√(x1+x2)^3 Исходные данные Тип микропроцессора Кр580BM80 ...

На микропроцессоре кр580 нужно написать программу "секундомер"
На микропроцессоре нужно написать программу "секундомер". начиная справа 2 ячейки отвечают за секунды,следущие 2 ячейки за минуты,и...

Написать программу "Кодовый замок" на Ассемблере КР580 по блок-схеме
Ребят помогите по этой блок схеме написать программу на ассемблере КР580

Написать программу вычисления значения функции при любом X
Написать программу вычисления значения функции при любом X. Написать на языке Assembler


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru