|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.12.2017, 18:22 | #1 |
Пользователь
Регистрация: 18.12.2016
Сообщений: 29
|
Написать с использованием циклов программу на Ассемблере для рисования прямоугольника заданного размера в месте экрана, заданного координатами левой верхней вершины при помощи мишк
Какие ошибки?
Код:
|
26.12.2017, 18:23 | #2 |
Пользователь
Регистрация: 18.12.2016
Сообщений: 29
|
Код:
|
26.12.2017, 20:40 | #3 |
Форумчанин
Регистрация: 25.01.2015
Сообщений: 472
|
Просто оставлю это здесь - http://www.cyberforum.ru/assembler-d...ad2161678.html
И выражу недоумение к топикстартеру по поводу появления данного поста. |
28.12.2017, 06:18 | #4 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
marysluva - это просто жесть какая-то!
70% кода можно смело отсеять в топку..
Нашедшего выход - затаптывают первым..
|
28.12.2017, 09:13 | #5 |
Форумчанин
Регистрация: 25.01.2015
Сообщений: 472
|
R71MT - да, ладно?!
Процентов 10-20 за счёт удаления описания нескольких курсоров и неиспользуемых процедур - согласен. Можно процедуры работы с мышью заменить макросами. Но не более. Смысл в процедурах (макросах) - именование действия, т.к. без этого придётся лезть в справочник. На быстродействие они не влияют, т.к. используются лишь при инициализации. Но "модульность" влияет на скорость сбора итоговой программы из однотипных образцов. Можно набрать этот же код без процедур (сокращение кучи push/pop, а с ними и десятки строк комментариев), но тогда main будет на несколько листов и смысл происходящего будет ускользать. Да и лично я привык программировать "сверху-вниз": сначала набираю main с вызовами несуществующих процедур, потом по мере отладки заполняю процедуры. Эту же задачу можно решить без прерываний - по опросу нажатия. Это сократит код, но мне не импонирует такое решение. |
28.12.2017, 11:46 | #6 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Цитата:
Зачем гонять данные в память и обратно, если в большинстве случаях они вообще не затрагиваются? Если уж сильно нужно, то проще записать их снова в регистр. Получается, что кто-то_когда-то сказал "сохранять все регистры перед входом в процедуру!", а зачем это нужно делать - объяснить забыл... Процесс R/W-памяти занимает уйму времени: если проц тратит на 'попы' сегм\регистров по 3-такта, то память на 'пуши' аж 24-своих тактов. Вот и посчитай, сколько там этих попов.. На запись в память тратятся в 2 раза больше DRAM-тактов, чем на чтение. -хотя проц тратит наоборот - больше на чтение, чем на запись. Вот и будет эта прога только писАть и читать память, вместо того, чтобы заниматься полезным делом. Я об этом говорю... Тут пуш'попится АХ, а на сл.шаге в этот-же АХ заносится новое значение. На счёт задания вообще не понятно, что нужно делать - сменить курсор или нарисовать прямоугольник. Если рисовать, то почему координата только верхняя???
Нашедшего выход - затаптывают первым..
|
|
28.12.2017, 19:16 | #7 |
Форумчанин
Регистрация: 25.01.2015
Сообщений: 472
|
А и вправду так долго или кэш процессора нивелирует?
Да даже если и так (долго), то на этапе обучения можно пренебречь скоростью выполнения процедур инициализации в пользу понятности кода. Не данный топикстартер, а какой нибудь другой разберётся с вызовами Mouse API и выполнит самостоятельно. |
28.12.2017, 19:23 | #8 |
Форумчанин
Регистрация: 25.01.2015
Сообщений: 472
|
Основная причина push/pop в том, что когда я разбирался с int 33h решил сделать на процедурах. Про макросы вспомнил позже, но переделывать не стал. А сейчас - на коренные изменения в шаблонных исходниках - нет времени. Может быть когда-нибудь (на том свете) отосплюсь, будет свободное время и оптимизирую код.
|
28.12.2017, 20:37 | #9 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
По сути, проц за пару-тройку обращений к памяти, поместит всю эту программу в свой кеш (т.к. читает память не байтами, а кеш-линейками по 64/128-байт - Intel/AMD). Данные отправятся в кеш-данных, а код - в кеш-инструкций. Но к сожалению, у ЦП нету кеша-стека! Любой пуш и поп отправляется прямиком в память - в этом и вся проблема.
Время операций R/W в память (в нс) сохранилось со-времён динозавров, поскольку здесь в игру вступают физические свойства конденсаторов динамической памяти, т.е. это время нельзя увеличить. Если раньше запись занимала в DRAM-тактах 25-30 (один пакетный цикл), то на новых типах памяти (DDR3) оно возросло до ~100 тактов. Расчитать его можно просуммировав тайминги памяти - на старых ОЗУ тайминги были ниже, сейчас выше. Процу по-барабану - он отправил запрос за свой такт, и занимается дальше своими делами. А дальше пыхтит уже сама память. А на счёт кода никаких претензий нет - в нём нет ничего нового, и он как-правило статичен. Это я так... просто увидел много пушей... Ничего личного..
Нашедшего выход - затаптывают первым..
|
28.12.2017, 20:46 | #10 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
R71MT
Не согласен с вашим утверждением. push pop так же кэшируются.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Написать с использованием циклов программу на Ассемблере | marysluva | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 20.12.2017 18:51 |
Попытка написать программу, которая для заданного числа i типа int const находит количество совпадающих единиц в старших 16 и младших 16 битах | Son1098 | Общие вопросы C/C++ | 2 | 25.10.2016 10:35 |
С++ Написать программу, для вывода предложений, состоящих из заданного количества слов | uropb992 | Помощь студентам | 0 | 28.05.2010 18:54 |
Написать программу которая для заданного символьного ряда подсчитывает количество слов! | komarvl | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 11.12.2009 01:42 |