Машинно-зависимая и машинно-независимая оптимизация кода ассемблера

Машинно-зависимая и машинно-независимая оптимизация кода ассемблера


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	 255 dup (?)

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_____; Занести в_____переменную _i 1

17____________________; mov bx,_i; Записать в BX _i

Строки 16, 17 заменить на mov bx, 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		; Занести в	BX 2

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		; Занести в	dx 0

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

Заменить на строку pop cx bx

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 cx dx

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 bx ax

77	005B C3			 ret

78	005C			 sl_itoa	 endp

79

80	005C			 sl_utoa	 proc

81	005C 50 53 51 52		 push ax	bx cx dx

82	0060 E8 0005			 call PutI2

83	0063 5A 59 5B 58		 pop dx	cx bx ax

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 Combine Class

DGROUP				 Group

STACK				 16 0100 Para	 Stack	 STACK

_DATA				 16 00FF Word	 Public DATA

_TEXT				 16 0080 Word	 Public CODE


3. Машинно-зависимая оптимизация кода ассемблера



Машинно-зависимая оптимизация предполагает:

Использование регистров процессора вместо ячеек оперативной памяти.

Использование непосредственно заданных операндов.

Использование косвенной адресации, когда операнд хранит адрес операнда.

Ограничение использования стека.

программа оптимизация ассемблер код

4. Машинно-независимая оптимизация кода ассемблера



Машинно-независимая оптимизация предполагает:

1. Одним из важнейших источников оптимизации кода является удаление общих подвыражений, т.е. подвыражений, которые встречаются в нескольких местах программы и вычисляют одно и то же выражение.

2. Другим источником оптимизации кода является удаление инвариантов цикла. Так называются подвыражения внутри цикла, результирующие значения которых не изменяются внутри цикла при переходе от одной итерации к другой. Поскольку для большинства программ основное время работы приходится на выполнение циклов, экономия времени от подобной оптимизации может быть весьма существенной.

3. Еще один источник оптимизации кода состоит в замене менее эффективных операций на более эффективные.






Выводы



До оптимизации исполняемый файл составлял 660 байт, а после оптимизации 640 байт.

В ходе оптимизации были произведены следующие действия:

– вместо переменных i, res используются регистры ax, bx, что является машинно-зависимой оптимизацией.

– удаление общих подвыражений, были объединены такие строки, как

pop сx

pop bx

в одну – pop сx bx;

push cx

push bx

в одну – push bx cx;

После проведенной оптимизации программа полностью сохранила свой смысл.