Розробка програми для передачі даних через com-порт комп"ютера з допомогою мов програмування С та асемблера. Описання програмних продуктів. Вивчення теорії оптимізації коду, онулення регістру. Контроль суми посилки, оцінка швидкості передачі інформації.
Метою даної курсової роботи є розробка програми для ЕОМ яка дозволяє передавати даний час в послідовний порт компютера в відповідності з наступним протоколом: перший знак $-символ початку рядка; наступні шість цифр відображають даний час. В даній курсовій роботі ми повинні навчитися програмувати порти компютера на прийом і передачу даних.Як відомо, кожну Win32 програму Windows запускає в окремому віртуальному просторі. Це означає, що кожна Win32 програма буде мати 4-х гігабайтовий адресний простір, але зовсім не означає, що кожна програма має 4 гігабайта фізичної памяті, а тільки те, що програма може звертатися за будь-якою адресою в цих межах. А Windows зробить усе необхідне, щоб зробити память, до якої програма звертається, "існуючою". Звичайно, програма повинна дотримуватися правил, встановлених Windows, або це викликає General Protection Fault. Ця особливість допомагає знизити шанс того, що одна програма запише що-небудь поверх даних або коду іншої програми.Ось шаблон програми Це асемблерна директива, що вказує асемблеру використовувати набір операцій для процесора 80386. Можна використовувати і .486, .586, але самий безпечний вибір - це вказувати .386. Ці "р"-версії необхідні тільки в тих випадках, коли ваша програма використовує привілейовані інструкції, тобто інструкції, зарезервовані процесором/операційною системою для захищеного режиму.STDCALL говорить MASMY про порядок передачі параметрів, ліворуч праворуч або праворуч ліворуч, а також про те, хто зрівнює стек після того як функція викликана. За С-домовленістю, параметри передаються справа наліво, тобто самий правий параметр кладеться в стек першим. Наприклад, при виклику функції з імям foo(int first_param, int second_param, int third_param), використовуючи С-передачу параметрів, асемблерний код буде виглядати так: push [third_param]; Покласти в стек третій параметр push [second_param] ; Слідом - другий push [first_param]; И, нарешті, перший call foo addsp, 12 ; зрівнюється стек Відповідно до неї, параметри передаються зліва направо і викликуваний повинний зрівнювати стек. С-порядок корисний, коли не знаємо, як багато параметрів будуть передані функції, як наприклад, у випадку wsprintf(), коли функція не може знати наперед скільки параметрів будуть покладені до стеку, так що вона не може його зрівняти.Загалом, ми оптимізуємо наш код, щоб він: · був менше Якщо ми оптимізуємо наш код: · код буде менше, але повільніше · код буде більше, але швидше · код буде менше і швидше Потрібно вирішувати, який шлях вибрати: · якщо наш код (або блок коду, наприклад процедура треда) маленька, ми повинні оптимізувати її так, щоб вона була більш швидкоюЗвичайно, здається логічним, що ми пишемо в регістр нуль, але можливо зробити більш оптимізовано так: ;2) sub eax, eax ;2 байти або ;3) xor eax, eax ;2 байтиДавайте подивимося на рішення: ;1) cmp eax, 00000000h ;5 байтів je _label_ ;2/6 байтів;1) cmp eax, 0ffffffffh ;5 байта je _label_;2/6 байтів А зараз подивимося, як це можна оптимізувати: ;2) inc eax;1 байт je _label_ ;2/6 байта dec eax;1 байт Так, так, так, ми зберегли три байти і зробили код швидше. Давайте подивимося, це можна зробити: Найгірш оптимізоване: ;1) mov eax, 0ffffffffh ;5 байт 2.6 Онулити регістр і перемістити що-небудь у нижнє слово або байтКраще: ;2) push 50h ;2 байти pop eax;1 байт Коли операнд досить малий (1 байт довжиною), push займає 2 байти. Неоптимізовано: ;3) push 0 ;2 байти push 0 ;2 байти push 0 ;2 байти push 0 ;2 байти push 0 ;2 байти push 0 ;2 байти push 0 ;2 байти Опимізовано, але все рівно забагато: ;4) xor eax, eax ;2 байти push eax ;1 байт push eax ;1 байт push eax ;1 байт push eax ;1 байт push eax ;1 байт push eax ;1 байт push eax ;1 байт _label_: push 0;2 байти loop _label_;2 байтиВона дозволяє відображати поточний час на екрані і виводити його в послідовний порт (com1 або com2) компютера у відповідності з наступним протоколом: перший знак - $ - символ початку рядка, наступних 6 цифр відображають поточний час. Потім випливає знак * - ознака кінця рядка.// functions for COM void WRITECOMM(short Form1->STATUSBAR1->Panels->Items[0]->Text = Resive; .code push NULL push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push NULL push 0 push GENERIC_READ push offset file_name call CREATEFILEA //COMMHANDLE=CREATEFILE(PORTNAME,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, // FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,0); if(Form1->Speed->Text == 2400) _DCB.BAUDRATE = CBR_2400; else if(Form1->Speed->Text == 4800) _DCB.BAUDRATE = CBR_4800; else if(Form1->Speed->Text == 9600) _DCB.BAUDRATE = CBR_9600; else if(Form1->Speed->Text == 14400) _DCB.
План
Зміст
Вступ
1. Теоретичні відомості
1.1 Описання програмних продуктів
1.2 Підключення функції
1.3 Аналіз "каркасу"
1.4 Опис директив
2. Оптимізація коду
2.1 Теорія оптимізації коду
2.2 Онулення регістру
2.3 Тест на те, чи рівний регістр нулеві
2.4 Тест на те, чи рівний регістр 0FFFFFFFFH
2.5 Перемістити 0FFFFFFFFH у регістр
2.6 Онулити регістр і перемістити що-небудь у нижнє слово або байт
2.7 Використання стека
Висновок
Список літератури
Додатки
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы