Машинно-зависимая и машинно-независимая оптимизация кодаассемблера
1.Постановка задачи
Лабораторная работа №3: Машинно-зависимая и машинно-независимаяоптимизация кода ассемблера.
На языке PASCAL написана следующая программа, предназначеннаядля определения нечетных чисел находящихся в массиве чисел:
var
res, i: integer;
begin
res:=0;
for i:=1 to 10 do
if i mod 2 0 then
begin
res:=i;
writeln (res);
end;
end.
2. Оптимизация программы
Листинг программы, полученной с помощью программы ALTER, для последующейоптимизации (подчеркнуты строки, измененные в процессе оптимизации):
Turbo Assembler Version 4.1 12/12/08 00:18:57 Page 1
11. ASM
1 0000 .Model Small
2 0000 .Stack 100h
3 0000 .Data
4 0000 FF*(??) __bufrw db 255dup (?)
5_________________________;_res_____ dw_____?
6_________________________;_i_____ dw_____?
Удалить строки 5 и 6
7 00FF .Code
8 0000 Main proc
9 0000 B8 0000s mov ax,@data
10 0003 8E D8 mov ds, ax
11 ; Присвоить переменной_res
12__________; mov _res, 0_____; Занести в_____переменную_res_____0
Строку 12 заменить на mov ax, 0
13 0005 B8 0000
14 ; Начало цикла FOR №1
15 ; Присвоить переменной_i
16____________________; mov _i, 1_____; Занести в_____переменную_i1
17____________________; movbx,_i; Записать в BX_i
Строки 16, 17 заменить на movbx, 1
18 0008 BB 0001
19 000B B9 000A mov cx, 10 ; Занести в cx 10
20 000E EB 01 jmp $+3 ; Перейтина 3 байта вперед
21 0010 for_b_1:
22 0010 43 inc bx ; Инкремент BX
23__________; push bx_______________; Записать BX в стек
24_______________; push cx_______________; Записать CX встек
Строки 23, 24 заменить на push bx cx
25 0011 53 51
26_____; mov _i, bx__________; Записать в переменную _i BX
Удалить строку 26
27 ; Обработка условия №1
28 ; Подготовка левой частиусловия
29 ; mov ax,_i ;Занести в AX переменную _i
30 0013 8B C3 mov ax,bx
31 0015 53 push bx
32 0016 BB 0002 mov bx, 2 ; Занести в BX2
33 0019 33 D2 xor dx, dx ; ОбнуляемDX
34 001B F7 F3 div bx ; Делениебез знака
35 001D 92 xchg ax, dx ; Поменятьзначение AX и BX
36 001E 8B D8 mov bx, ax ;Записать в bx ax
37 ; Подготовка правой частиусловия
38 0020 BA 0000 mov dx, 0 ; Занести в dx0
39 0023 3B DA cmp bx, dx ; СравнитьBX c DX
40 0025 5B pop bx
41 0026 74 0F je else_1
42 ; Присвоить переменной_res
43__________; mov ax,_i__________; Занести в_____AX переменную _i
Заменить на строку mov ax, bx
44 0028 8B C3
45_____; mov _res, ax_____; Занести в_____переменную _res_____AX
Удалить строку 45
46 ; Обработка процедурыWRITE
47__________; mov ax,_res_____; Занести в_____AX переменную_res
Удалить строку 45
48 002A E8 0014 call sl_itoa; Вызвать функциюпреобразования
49 002D B4 02 mov ah, 2 ; Загрузить вAH номер функции
50 002F B2 0D mov dl, 13 ; Выводимый символ
51 0031 CD 21 int 21h ; Вызватьпрерывание DOS
52 0033 B2 0A mov dl, 10 ; Выводимый символ
53 0035 CD 21 int 21h ; Вызватьпрерывание DOS
54 0037 else_1:
55 ; Переход если не выполнилосьусловие №1
56__________; pop cx__________; Вернуть из стека в CX
57_______________; pop bx__________; Вернуть из стека в BX
Заменить на строку popcxbx
Turbo Assembler Version 4.1 12/12/08 00:18:57 Page 2
11.ASM
58 0037 59 5B
59 0039 3B D9 cmp bx, cx ; СравнитьBX и CX
60 003B 75 D3 jne for_b_1 ; Переходесли не равно
61 ; Конец цикла FOR №1
62 003D B4 4C mov ah, 4ch
63 003F CD 21 int 21h
64 0041 endp
65 0041 sl_itoa proc
66 0041 50 53 51 52 push ax bx cxdx
67 0045 3D 0000 cmp ax, 0
68 0048 7D 0A jge Doit
69 004A 50 push ax
70 004B B2 2D mov dl, '-'
71 004D B4 02 mov ah, 2
72 004F CD 21 int 21h
73 0051 58 pop ax
74 0052 F7 D8 neg ax
75 0054 E8 0011 DoIt: call puti2
76 0057 5A 59 5B 58 pop dx cx bxax
77 005B C3 ret
78 005C sl_itoa endp
79
80 005C sl_utoa proc
81 005C 50 53 51 52 push ax bx cxdx
82 0060 E8 0005 call PutI2
83 0063 5A 59 5B 58 pop dx cx bxax
84 0067 C3 ret
85 0068 sl_utoa endp
86
87 0068 Puti2 proc
88 0068 BB 000A mov bx, 10
89 006B 33 D2 xor dx, dx
90 006D F7 F3 div bx
91 006F 0B C0 or ax, ax
92 0071 74 05 jz Done
93 0073 52 push dx
94 0074 E8 FFF1 call Puti2
95 0077 5A pop dx
96 0078 Done:
97 0078 80 CA 30 or dl, '0'
98 007B B4 02 mov ah, 2
99 007D CD 21 int 21h
100 007F C3 ret
101 0080 PutI2 endp
102
103 end Main
Turbo Assembler Version 4.1 12/12/08 00:18:57 Page 3
Symbol Table
Symbol Name Type Value
?? DATE Text «12/12/08»
?? FILENAME Text «11 »
?? TIME Text «00:18:56»
?? VERSION Number 040A
@32BIT Text 0
@CODE Text _TEXT
@CODESIZE Text 0
@CPU Text 0101H
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text 11
@INTERFACE Text 000H
@MODEL Text 2
@STACK Text DGROUP
@WORDSIZE Text 2
DOIT Near _TEXT:0054
DONE Near _TEXT:0078
ELSE_1 Near _TEXT:0037
FOR_B_1 Near _TEXT:0010
MAIN Near _TEXT:0000
PUTI2 Near _TEXT:0068
SL_ITOA Near _TEXT:0041
SL_UTOA Near _TEXT:005C
__BUFRW Byte DGROUP:0000
Groups & Segments Bit Size Align CombineClass
DGROUP Group
STACK 16 0100 Para Stack STACK
_DATA 16 00FF Word PublicDATA
_TEXT 16 0080 Word PublicCODE
3. Машинно-зависимая оптимизация кода ассемблера
Машинно-зависимая оптимизация предполагает:
1) Использованиерегистров процессора вместо ячеек оперативной памяти.
2) Использованиенепосредственно заданных операндов.
3) Использованиекосвенной адресации, когда операнд хранит адрес операнда.
4) Ограничениеиспользования стека.
программа оптимизация ассемблер код
4. Машинно-независимая оптимизация кода ассемблера
Машинно-независимая оптимизация предполагает:
1. Одним изважнейших источников оптимизации кода является удаление общих подвыражений, т.е.подвыражений, которые встречаются в нескольких местах программы и вычисляютодно и то же выражение.
2. Другимисточником оптимизации кода является удаление инвариантов цикла. Так называютсяподвыражения внутри цикла, результирующие значения которых не изменяются внутрицикла при переходе от одной итерации к другой. Поскольку для большинствапрограмм основное время работы приходится на выполнение циклов, экономиявремени от подобной оптимизации может быть весьма существенной.
3. Еще одинисточник оптимизации кода состоит в замене менее эффективных операций на болееэффективные.
Выводы
До оптимизации исполняемый файл составлял 660 байт, а послеоптимизации 640 байт.
В ходе оптимизации были произведены следующие действия:
– вместо переменных i, res используются регистры ax, bx, что являетсямашинно-зависимой оптимизацией.
– удаление общих подвыражений, были объединены такие строки,как
pop сx
pop bx
в одну – pop сx bx;
push cx
push bx
водну – push bxcx;
После проведенной оптимизации программа полностью сохранила свойсмысл.