Возможно ли оптимизировать код - 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

Объяснение кода листинга программы

  1. X DB 2 - в данной директиве определяется переменная X со значением 2
  2. Y DB 0 - в данной директиве определяется переменная Y со значением 0
  3. Z DD ? - в данной директиве определяется переменная Z, которая будет содержать результат вычислений
  4. aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, Press ENTER to exit, 0 - в данной директиве определяется строка aszPressEnter, которая будет выводиться на экран
  5. hConsoleOutput HANDLE ? - в данной директиве определяется переменная hConsoleOutput, которая будет содержать описатель консоли вывода
  6. hConsoleInput HANDLE ? - в данной директиве определяется переменная hConsoleInput, которая будет содержать описатель консоли ввода
  7. Buffer db 1024 dup(?) - в данной директиве определяется буфер, который будет использоваться для обмена данными с консолью
  8. BufLen dd ? - в данной директиве определяется переменная BufLen, которая будет содержать длину строки в буфере
  9. GetStdHandle - функция получения описателя стандартного объекта, в данном случае описывается получение описателей консоли ввода и вывода
  10. MOV - команда перемещения данных из одной переменной в другую
  11. CALL - команда вызова подпрограммы
  12. PR PROC - определение подпрограммы PR
  13. XCHG - команда обмена значениями двух переменных
  14. IMUL - команда умножения двух чисел
  15. SUB - команда вычитания одного числа из другого
  16. RET - команда возврата из подпрограммы
  17. WRITECONSOLE - функция записи данных в консоль
  18. LTOA - функция преобразования числа в строку
  19. STRLEN - функция определения длины строки
  20. EXITPROCESS - функция завершения работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5