LINUX.ORG.RU
ФорумTalks

Assembler на кр580 (i8080)


0

0

в нашем любимом вузе есть чудо предмет "микропроцессорная техника", а пишут там на ассемблере под кр580, пришлось писать, теперь нада проверить, ток теперь нада проверить. Эмулятора этого чуда под linux я не нашел, поэтому юзал эмулятор спектрума на котором аналогичный процессор, но что-то мы не договорились. Помогите пожалуйста, вот программа:
Адрес Код Команда Операторы Комментарий
;Программа y=2X1+X2-X3
ORG 820 ;Начать программу с адреса 0820H
820 21 LXI H,86F ;заслать адрес ячейки памяти в регистровую пару HL
821 6F
822 08
823 3E MVI A,E0 ;заслать X1 в регистр A
824 E0
825 0E MVI C,6E ;заслать X2 в регистр C
826 6E
827 16 MVI D,60 ;заслать X3 в регистр D
828 60
829 87 ADD A ;сложить содержимое акамулятора с самим собой
82A 81 ADD C ;сложить содержимое акамулятора с регистром С
82B 92 SUB D ;вычесть содержимое регистра D из акамулятора
82C 77 MOV M,A ;заслать содержиоме акамулятора в ячейку памяти адрес которой находится в регистровой паре
END ;конец программы


Ответ на: комментарий от scyld

>может будешь спорить, что JMP - это плохой тон?

Хороший тон -- это ADC и SBB в старшем байте результата. Но я повторяю, что было 3 часа ночи, я сжалился над человеком. Смотри программку у него -- у него младший байт все время в аккумуляторе, а ADC и SBB тоже просят аккумулятор. То есть пришлось бы мне перед ADC и SBB со старшим быйтом, где-то сохранять младший байт (в регистре), а потом назад его возвращать. Просто вместо JNC тупого было бы куча MOV туда, MOV сюда.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Твое решение работает нормально для 8-битных. А я делал как бы общий случай, который должен распространяться на все. Даже на 32-бита. Ну нет 32-битных операций в 8080. Я предполагал вообще, что в задании слишком просто отталкиваться от 8-битных, но мне так было удобнее. Но если бы потребовалось быстро переписать для 16-битных, то все проверки заемов и переносов остались бы. Надо было бы результат хранить в 24 или 32 битах.

ну так нету у тебя общего решения. у тебя 8 бит. вот написал бы для 32х и 16, тогда бы и говорил, что общее.

чел же ясно просил "с регистровыми парами и без переходов"

scyld
()
Ответ на: комментарий от scyld

Регистров-то мало у 8080, а арифметические операции только с ACC работают, а с другими регистрами нет. Так что вот отсюда и решение с JNC. Оно реально короткое.

Zubok ★★★★★
()
Ответ на: комментарий от scyld

>ну так нету у тебя общего решения. у тебя 8 бит. вот написал бы для 32х и 16, тогда бы и говорил, что общее.

Все элементы проверок или сложений с ADC/SBB так бы и остались. Только пришлось бы все время это делать через каждый 16-бит. Я имел в виду, что такой подход с проверкой бита Carry надо делать в общем случае. У меня просто этот случай иллюстрирован для 8 бит.

>чел же ясно просил "с регистровыми парами и без переходов"

Чел сказал то, что было в первом посте. Почитай его и найди эти слова. А то, что он поутру дописал, когда я спал -- это уже извините.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Zubok, мир, а?

просто я лучше определю диапазон значений и не буду использовать проверку переносов. это просто мой подход. лишние проверки и переходы - увеличивают число состояний. это вредно. это - вакансии для косяков :)

scyld
()
Ответ на: комментарий от scyld

Извиняюсь, необязательно чтобы адрес был в hl, эт просто я его совал в hl, поэтому окончательно вроде так:
ORG 820 ;Начать программу с адреса 0820H
3E MVI H,E0 ;заслать X1 в регистровую пару HL
E0
0E MVI B,6E ;заслать X2 в регистровую пару BC
6E
16 MVI D,60 ;заслать X3 в регистровую пару DE
60
29 DAD H ; hl=hl+hl
09 DAD B ; hl=hl+bc
7B MOV A,E ; заслать содержимое регистра E в аккумулятор
2F CMA ; инвертируем A
5F MOV E,A ; заслать содержимое аккумулятора в регистр Е
7A MOV A,D ; заслать содержимое регистра D в акамулятор
2F CMA ; инвертируем A
57 MOV D,A ; заслать содержимое аккумулятора в регистр D
13 INX D ; de+1 (здесь de=-de :)
19 DAD D ; hl=hl+de
21 LXI D,86F ;заслать адрес ячейки памяти в регистровую пару DE
6F
08
56 MOV D,M ; заслать ссодержимое регистровой пары HL в ячейку памяти адрес которой находится в регистровой паре DE
END ;конец программы

Frolic
() автор топика
Ответ на: комментарий от scyld

>Zubok, мир, а?

Да я не сторонник конфликтов. Я отталкивался от того, что человек написал в виде программы и косвенного понимания задания. Я не понимаю такого смысла этого задания, если бы оно не было нацелено для изучения работы бита Carry. То, что числа жестко заданы в задании, тоже не было упомянуто. Тогда можно было бы и под число подстроиться. Я ведь про ADC и SBB заговорил сразу же (см. начало треда). Я сначала хотел написать программу кошерно (то есть сначала я вообще ничего писать не хотел), чтобы было ADC и SBB. Потом человек стал говорить про какую-то методу, где этих команд нет. Что за метода, я нифига не понял. Почему в методе нет этих команд, тоже. На уточняющие вопросы о битности чисел тоже не было никакой реакции. Я помню наши задания (для тех, кто не умел), которым сто лет в обед, так у нас 32-битные деления и умножения, а также эмуляция плавающей точки было. А тут...

Я хочу сказать про переходы. Переходы -- это лишнее число тактов. В 8080 их там много на переход. Но если учесть взаимные пересылки из регистров в регистр для промежуточного хранения, то еще надо посчитать по тактам (кто сегодня это делает?), что быстрее. Не думаю, конечно, что переход быстрее. Я сделал так, чтобы быстрее написать программу и пойти спать, потому что если бы программа была совсем другой, то получил бы еще сто вопросов уточняющих.

Мир.

Zubok ★★★★★
()
Ответ на: комментарий от Frolic

Еще раз всем спасибо, сегодня сдал программу. Препод молча схавал :)

Frolic
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.