Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
ChalkLaito
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 9
1

оптимизация программы

16.12.2013, 08:56. Просмотров 334. Ответов 4
Метки нет (Все метки)

проблема такая: сделал программу на паскале перевел через лехх получил код и вот теперь нужно этот код как то оптимизировать.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
.Model Small
.Stack 100h
.Data
__bufrw     db   255 dup (?)
 _i     dw ?
 _a     dw ?
 _c     dw ?
_mes1 db "vvedite a="
_mes2 db "vvedite i="
.Code
 Main proc
mov ax,@data
mov ds,ax
;Обработка процедуры WRITE
mov ah,40h      ;Загрузить в AH номер функции
mov bx,1        ;Выводить на экран
mov cx,10       ;Кол-во выводимых символов
lea dx,_mes1        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
;Обработка процедуры READ
mov ah,3fh      ;Загрузить в AH номер функции
mov bx,0        ;Считывать с клавиатуры
lea dx,__bufrw      ;Загрузить в DX адрес буфера
mov cx,10       ;Максимальное кол-во считываемых символов
int 21h         ;Вызвать прерывание DOS
mov di,offset __bufrw   ;Настроить di на буфер
call sl_atoi        ;Вызвать функцию преобразования
mov _a,ax       ;Загрузить значение из AX в переменную _a
;Обработка процедуры WRITE
mov ah,40h      ;Загрузить в AH номер функции
mov bx,1        ;Выводить на экран
mov cx,10       ;Кол-во выводимых символов
lea dx,_mes2        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
;Обработка процедуры READ
mov ah,3fh      ;Загрузить в AH номер функции
mov bx,0        ;Считывать с клавиатуры
lea dx,__bufrw      ;Загрузить в DX адрес буфера
mov cx,10       ;Максимальное кол-во считываемых символов
int 21h         ;Вызвать прерывание DOS
mov di,offset __bufrw   ;Настроить di на буфер
call sl_atoi        ;Вызвать функцию преобразования
mov _i,ax       ;Загрузить значение из AX в переменную _i
;Присвоить переменной _c
mov ax,_i       ;Занести в AX переменную _i
mov bx,_a       ;Занести в BX переменную _a
xor dx,dx       ;Обнуляем DX
imul bx         ;Умножение со знаком
mov _c,ax       ;Записать в переменную _c ax
;Обработка условия №1
;Подготовка левой части условия
mov bx,_c       ;Занести в bx переменную _c
;Подготовка правой части условия
mov dx,_a       ;Занести в dx переменную _a
cmp bx,dx       ;Сравнить BX c DX
jne else_1
;Обработка процедуры WRITE
mov ax,_c       ;Занести в AX переменную _c
call sl_itoa        ;Вызвать функцию преобразования
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
jmp endif_1     ;Безусловный переход
else_1:
;Если не выполнилось условие №1
;Обработка процедуры WRITE
mov ax,_a       ;Занести в AX переменную _a
call sl_itoa        ;Вызвать функцию преобразования
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
endif_1:
;Конец условия №1
mov ah,4ch
int 21h
 endp
sl_itoa         proc
    push    ax bx cx dx
    cmp     ax, 0
    jge     Doit
    push    ax
    mov     dl, '-'
    mov     ah,2
    int     21h
    pop     ax
    neg     ax
DoIt:           call    puti2
    pop     dx cx bx ax
    ret
sl_itoa         endp
 
sl_utoa         proc
    push    ax bx cx dx
    call    PutI2
    pop     dx cx bx ax
    ret
sl_utoa         endp
 
Puti2           proc
    mov     bx, 10
    xor     dx, dx
    div     bx
    or      ax, ax
    jz      Done
    push    dx
    call    Puti2
    pop     dx
Done:
    or      dl, '0'
    mov ah,2
    int 21h
    ret
PutI2        endp
 
sl_atoi         proc
    push    di
    call    sl_atoi2
    pop     di
    ret
sl_atoi         endp
 
sl_atoi2        proc
    push    cx
    push    dx
    xor     cx, cx
    mov     ah, ch
    cmp     byte ptr ds:[di], '-'
    jne     DoAtoI
 
inc     di
    mov     ah, 1
DoAtoI:         call    NAtoI
    jc      WasError
    cmp     ah, 0
    je      IsPositive
    neg     cx
    clc
    jmp     WasError
IsPositive:     or      cx, cx
    clc
    jns     WasError
    stc
    WasError:       mov     ax, cx
    pop     dx
    pop     cx
    ret
sl_atoi2        endp
 
sl_atou         proc
    push    di
    call    sl_atou2
    pop     di
    ret
sl_atou         endp
 
sl_atou2        proc
    push    cx
    push    dx
    xor     cx, cx
    call    NAtoI
    mov     ax, cx
    pop     dx
    pop     cx
    ret
sl_atou2        endp
 
NAtoI           proc
    pushf
    cld
lp:             mov     al, ds:[di]
    inc     di
    xor     al, '0'
    cmp     al, 10
    ja      NotDigit
    shl     cx, 1
    jc      Error
    mov     dx, cx
    shl     cx, 1
    jc      Error
    shl     cx, 1
    jc      Error
    add     cx, dx
    jc      Error
    add     cl, al
    adc     ch, 0
    jc      Error
    jmp     lp
NotDigit:       popf
    clc
    ret
Error:          popf
    stc
    ret
NAtoI           endp
end Main
Pascal
1
2
3
4
5
6
7
8
9
10
VAR
i,a,c:integer;
begin
writeln('vvedite a=');
readln(a);
writeln('vvedite i=');
readln(i);
c:=i*a;
if c=a then writeln(c) else writeln(a);
end.
подскажите что можно изменить

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 08:56
Ответы с готовыми решениями:

Оптимизация программы(Гипотеза Коллатца)
(https://ru.wikipedia.org/Гипотеза_Коллатца) Суть гипотезы загключается в...

Оптимизация кода
В VS2012 скомпилировал программу и получил ассемблеровский код ...

оптимизация сравнений
можно ли как-нибудь оптимизироваить сей цикл? @@1: lodsb cmp al, 41h ja...

Оптимизация функции
Просто ради интереса собрал функцию на ассемблере которая создаёт список всех...

Сомнительная оптимизация от Intel C++
Всем привет! Есть такой код: #include <windows.h> int _strlen(char *s) {...

4
AFP
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
16.12.2013, 21:11 2
Можно вывод строк
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_mes1 db "vvedite a="
_mes2 db "vvedite i="
.Code
 Main proc
mov ax,@data
mov ds,ax
;Обработка процедуры WRITE
mov ah,40h      ;Загрузить в AH номер функции
mov bx,1        ;Выводить на экран
mov cx,10       ;Кол-во выводимых символов
lea dx,_mes1        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
Заменить на:
Assembler
1
2
3
4
5
6
7
8
9
10
_mes1 db "vvedite a=",13,10,"$"
_mes2 db "vvedite i=",13,10,"$"
.Code
 Main proc
mov ax,@data
mov ds,ax
;Обработка процедуры WRITE
mov ah,9
lea dx,_mes1        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
и
Assembler
1
2
3
4
5
6
7
8
9
10
11
;Обработка процедуры WRITE
mov ah,40h      ;Загрузить в AH номер функции
mov bx,1        ;Выводить на экран
mov cx,10       ;Кол-во выводимых символов
lea dx,_mes2        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
mov ah,2        ;Загрузить в AH номер функции
mov dl,13       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
mov dl,10       ;Выводимый символ
int 21h         ;Вызвать прерывание DOS
на
Assembler
1
2
3
4
;Обработка процедуры WRITE
mov ah,9      ;Загрузить в AH номер функции
lea dx,_mes2        ;Настроить dx на адрес выводимого сообщения
int 21h         ;Вызвать прерывание DOS
и наверное много еще, но лень разбираться.
Возможно вам и этого хватит
1
ChalkLaito
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 9
17.12.2013, 18:34  [ТС] 3
спасибо большое))

Добавлено через 3 часа 7 минут
Assembler
1
2
_mes1 db "vvedite a=",13,10,"$"
_mes2 db "vvedite i=",13,10,"$"
обьясните пожалуйсто вот это почему именно 13 и 10?
0
TFS
551 / 33 / 6
Регистрация: 11.12.2013
Сообщений: 92
17.12.2013, 19:06 4
Это управляющие коды ASCII-таблицы - возврат каретки и перевод строки. Первый возвращает курсор в начало строки, второй переносит его на строчку вниз.

Возврат каретки
http://ru.wikipedia.org/wiki/%D0%92%...82%D0%BA%D0%B8

Перевод строки
http://ru.wikipedia.org/wiki/%D0%9F%...BE%D0%BA%D0%B8
0
AFP
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
17.12.2013, 19:27 5
Для ввода значений лучше будет так:
Assembler
1
2
_mes1 db 13,10,"vvedite a=$"
_mes2 db 13,10,"vvedite i=$"
0
17.12.2013, 19:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 19:27

Оптимизация по скорости и размеру
На асmp.ru есть "задача про XOR" Моё решение не проходит по скорости на 16...

[Оптимизация] Планировщик процессов
Всех приветствую! В данный момент разбираюсь с сие чудом - планировщиком. Вещь...

Оптимизация RGB->YUV
Вот такая простая задачка как перевод картинки из RGB в YUV формат. Начальный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru