Зміст звіту

1. Постановка задачі для отриманого варіанта завдання.

2. Блок-схема алгоритму виконання прикладу з детальним коментарем.

3. Лістинг програми з детальним коментарем до кожної команди.

4. Рrint screen екрана 32-розрядного налагоджувача з виконанням програми та результатами виконання.

5. Короткий опис виконання програми.

6. Висновки за результатами роботи.

Приклад 7.8.Написати на асемблері програму обчислення виразу

а × b + c, де a = 4, b = 5, c = 6,

оформити її у вигляді API-подібної функції та зберегти результат виконання виразу у пам’яті.

Лістинг 7.24. Програма обчислення прикладу 7.8:

title CopyRight by Rysovaniy A. N. rysov@rambler.ru

.386 ; директива визначення типу мікропроцесора

.model flat,stdcall ; завдання лінійної моделі пам’яті

; та угоди ОС Windows

option casemap:none ; відмінність малих та великих літерincludelib masm32v9_0libkernel32.lib ; виклик бібліотеки kernel32.libExitProcess proto :DWORD ; прототип процедуриOperDigs proto :WORD, :WORD, :WORD ; прототип процедури.data ; директива визначення данихres dw 2 dup(0) ; резервування комірок для результату.code ; директива початку програми_start: ; мітка початку програми з ім’ям _startinvoke OperDigs,4,5,6 ; виклик директиви з параметрамиinvoke ExitProcess,0 ; виклик директиви з параметрамиOperDigs proc arg1:WORD,arg2:WORD,arg3:WORDmov ax,arg1 ; ax := arg1 (число 4)mul arg2 ; dx,ax = ax × arg2add ax, arg3 ; ax := ax + arg3 (число 6)jc m1 ; перейти, якщо є перенесенняjmp m2 ; безумовний перехід на збереження результатуm1: inc dx ; dx + 1, якщо перенесення єm2: mov res,ax ; запам’ятовування в пам’ятіmov res+2,dx ; запам’ятовування в пам’яті ret ; повернення з процедуриOperDigs endp ; закінчення процедури OperDigsend _start ; закінчення програми з ім’ям _start У зв’язку з тим, що числа вибрані невеликі, то для їх визначення вибрано слово WORD. Команди розгалуження jc та jmp необхідні для випадку, коли використовуватимуть числа, які могуть дати переповнення розрядної сітки.

Порядок розміщення даних у пам’яті та стан налагоджувача OllyDbg з програмою з лістингу 7.21 наведено на рис. 7.13.

Параметри процедури OperDigs розміщуються в стеці за порядком справо наліво (спочатку – число 6 := arg3, потім – число 5 := arg2, а на остаток – число 4 := arg1). Директива invoke замінює дві команди: CALL та PUSH 0, де PUSH 0 – код успішного завершення, який повертається операційній системі. При виконанні команди CALL 7_10L.00401012 після аргументів записується код повернення в процедуру, а вже потім передається керування командам процедури.

Результат виконання операції прикладу 7.8 розташовано у двох регістрах: EAX = 001А, та EDX = 0000.

 

 


7.12 Лабораторна робота “Зовнішні процедури”

Мета заняття:

– поглибити і закріпити знання з архітектури МП платформи х86 і навички його програмування;

– придбати практичні навички складання, налагодження і виконання програм, написаних мовою асемблеру з використанням зовнішніх процедур для МП платформи х86.