Возможно ли оптимизировать код - Assembler
Формулировка задачи:
Задача:
(x+2)2-(y-3)2,если x2-y2<2
z=
x2-y2-1,иначе
вот пример моей программы :
Возможно ли это оптимизировать , если да , то как ?
.586 .model flat,stdcall extern ExitProcess@4:near includelib c:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib data segment x DB 2 y DB 0 z DW ? data ends text segment start: MOV AL,X MOV CL,Y CALL PR SUB BX,AX CMP BX ,2 JL A1 DEC BX JMP FIN A1:MOV AL,X ADD AL,2 MOV CL,Y SUB CL,3 SUB BX,AX FIN:MOV Z,BX push 0 call ExitProcess@4 PR PROC IMUL AL MOV BX,AX MOV AL,CL IMUL AL RET PR ENDP text ends end start
Решение задачи: «Возможно ли оптимизировать код»
textual
Листинг программы
.486 .model flat, stdcall option casemap :none include d:\masm32\include\windows.inc include d:\masm32\include\user32.inc include d:\masm32\include\kernel32.inc include d:\masm32\include\masm32.inc includelib d:\masm32\lib\user32.lib includelib d:\masm32\lib\kernel32.lib includelib d:\masm32\lib\masm32.lib data segment X DB 2 Y DB 0 Z DD ? aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0 hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Buffer db 1024 dup(?) BufLen dd ? data ends text segment start: ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax MOV AL,X MOV BL,Y CALL PR CMP AX,2 JL A1 DEC AX JMP FIN A1:MOV AL,X ADD AL,2 MOV BL,Y SUB BL,3 CALL PR FIN: cwde MOV [Z],eax invoke ltoa, [Z], ADDR Buffer invoke StrLen, ADDR Buffer mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL ;ожидание нажатия ENTER invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\ LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL invoke ExitProcess, 0 PR PROC XCHG AL,BL IMUL AL MOV CX,AX MOV AL,BL IMUL AL SUB AX,CX RET PR ENDP text ends end start
Объяснение кода листинга программы
- X DB 2 - в данной директиве определяется переменная X со значением 2
- Y DB 0 - в данной директиве определяется переменная Y со значением 0
- Z DD ? - в данной директиве определяется переменная Z, которая будет содержать результат вычислений
- aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah,
Press ENTER to exit
, 0 - в данной директиве определяется строкаaszPressEnter
, которая будет выводиться на экран - hConsoleOutput HANDLE ? - в данной директиве определяется переменная hConsoleOutput, которая будет содержать описатель консоли вывода
- hConsoleInput HANDLE ? - в данной директиве определяется переменная hConsoleInput, которая будет содержать описатель консоли ввода
- Buffer db 1024 dup(?) - в данной директиве определяется буфер, который будет использоваться для обмена данными с консолью
- BufLen dd ? - в данной директиве определяется переменная BufLen, которая будет содержать длину строки в буфере
- GetStdHandle - функция получения описателя стандартного объекта, в данном случае описывается получение описателей консоли ввода и вывода
- MOV - команда перемещения данных из одной переменной в другую
- CALL - команда вызова подпрограммы
- PR PROC - определение подпрограммы PR
- XCHG - команда обмена значениями двух переменных
- IMUL - команда умножения двух чисел
- SUB - команда вычитания одного числа из другого
- RET - команда возврата из подпрограммы
- WRITECONSOLE - функция записи данных в консоль
- LTOA - функция преобразования числа в строку
- STRLEN - функция определения длины строки
- EXITPROCESS - функция завершения работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д