Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32ax.inc'
  5. ;_________________
  6. ;                 |
  7. ;   Made by       |
  8. ;   Vladimir      |
  9. ;   Tikhomirov    |
  10. ;   БПИ171        |
  11. ;   Вариант 16    |
  12. ;_________________|
  13.              
  14. ;---|--------------------|------------------------------------------------------
  15. ;---|-DATA SECTION-------|------------------------------------------------------
  16. ;---|--------------------|------------------------------------------------------
  17. section '.data' data readable writeable
  18.         caption db 'Result', 0
  19.  
  20.         msg db 256 dup ? ; сообщение для вывода
  21.         CommadLineLink dd ?  ; ссылка на командную строку
  22.         ou db "(%d/%d) + (%d/%d)i",13,10
  23.               db "operatoin:  %s",13,10
  24.         ; Структура, представляющая собой дробное число
  25.         struct fraction
  26.                num dd ?
  27.                denom dd ?
  28.         ends
  29.         ; представляет собой простое комплексное число, состоящиее
  30.         ; из действительной и мнимой части
  31.         struct  compn
  32.                   ReF fraction ; действительная часть комплексного числа в виде
  33.                                ;дроби
  34.                   ImF fraction ; мнимая часть комплексного числа в виде дроби
  35.         ends
  36.  
  37.         ; комплексные числа над которыми будут проводитьяс операции
  38.         cnum1 compn
  39.         cnum2 compn
  40.         result compn ; результат вычислений
  41. ;---|--------------------|------------------------------------------------------
  42. ;---|-END DATA SECTION---|------------------------------------------------------
  43. ;---|--------------------|------------------------------------------------------
  44.  
  45. ;---|--------------------|------------------------------------------------------
  46. ;---|-CODE SECTION-------|------------------------------------------------------
  47. ;---|--------------------|------------------------------------------------------
  48. section '.code' code readable writeable executable
  49.  
  50.         start:  
  51.                 cinvoke GetCommandLine ; записываем в eax ссылку на cmd
  52.                 mov [CommadLineLink], eax  ; копируем ссылку в переменную cmdlk
  53.                 cinvoke sscanf, [CommadLineLink], "%*s %d/%d %d/%d %d/%d %d/%d",\
  54.                  cnum1.ReF.num,\  
  55.                  cnum1.ReF.denom,\
  56.                  cnum1.ImF.num,\
  57.                  cnum1.ImF.denom,\
  58.                  cnum2.ReF.num,\
  59.                  cnum2.ReF.denom,\
  60.                  cnum2.ImF.num,\
  61.                  cnum2.ImF.denom      
  62.        
  63.                 cmp [cnum1.ReF.denom], 0
  64.                 je error
  65.                
  66.                 cmp [cnum1.ImF.denom], 0
  67.                 je error
  68.                
  69.                 cmp [cnum2.ReF.denom], 0
  70.                 je error
  71.                
  72.                 cmp [cnum2.ImF.denom], 0
  73.                 je error
  74.                 addition:
  75.                   xor eax, eax
  76.                   xor ebx, ebx
  77.                   mov ebx, [cnum1.ReF.num]  ; записываем значение числителя
  78.                                             ; вещ. части комп. числа в ebx
  79.                   imul ebx, [cnum2.ReF.denom]; умножаем на знаменатель второго
  80.                   mov [result.ReF.num], ebx ; копируем значение в результат
  81.                   mov ebx, [cnum2.ReF.num]   ; аналогично для второго числа
  82.                   imul ebx, [cnum1.ReF.denom] ; перемножаем их и перезаписываем ebx
  83.                   add [result.ReF.num], ebx   ; записываем(складывая) результат вычислений в result
  84.                   mov ebx, [cnum1.ReF.denom]  ; записывам знаменатель первого числа в ebx
  85.                   imul ebx, [cnum2.ReF.denom] ; перемножаем знаменатели обоих дробей
  86.                   mov [result.ReF.denom], ebx ; записываем знаменатель в result
  87.                  
  88.                   mov ebx, [cnum1.ImF.num]    ; Аналогичные действия для мнимых
  89.                   imul ebx, [cnum2.ImF.denom] ; Частей комплексных чисел
  90.                   mov [result.ImF.num], ebx   ;
  91.                   mov ebx, [cnum2.ImF.num]    ;
  92.                   imul ebx, [cnum1.ImF.denom] ;
  93.                   add [result.ImF.num], ebx   ;
  94.                   mov ebx, [cnum1.ImF.denom]  ;
  95.                   imul ebx, [cnum2.ImF.denom] ;
  96.                   mov [result.ImF.denom], ebx ;
  97.                  
  98.                     cinvoke sprintf, msg, ou,\
  99.                     [result.ReF.num],\
  100.                     [result.ReF.denom],\
  101.                     [result.ImF.num],\
  102.                     [result.ImF.denom],\
  103.                     "Add"
  104.                     invoke MessageBox, HWND_DESKTOP, msg, caption, 0
  105.                    
  106.                   ; ГОТОВО
  107.                 ; Операция вычитания аналогична сложению, за одним маленьким
  108.                 ; исключением
  109.                substr:
  110.                   xor ebx, ebx
  111.                   xor eax,eax
  112.                  
  113.                   mov ebx, [cnum1.ReF.num]
  114.                   imul ebx, [cnum2.ReF.denom]
  115.                   mov [result.ReF.num], ebx
  116.                   mov ebx, [cnum2.ReF.num]
  117.                   imul ebx, [cnum1.ReF.denom]
  118.                   sub [result.ReF.num], ebx   ; все тоже самое за исключением вычитания
  119.                   mov ebx, [cnum1.ReF.denom]
  120.                   imul ebx, [cnum2.ReF.denom]
  121.                   mov [result.ReF.denom], ebx
  122.                  
  123.                   mov ebx, [cnum1.ImF.num]
  124.                   imul ebx, [cnum2.ImF.denom]
  125.                   mov [result.ImF.num], ebx
  126.                   mov ebx, [cnum2.ImF.num]
  127.                   imul ebx, [cnum1.ImF.denom]
  128.                   sub [result.ImF.num], ebx
  129.                   mov ebx, [cnum1.ImF.denom]
  130.                   imul ebx, [cnum2.ImF.denom]
  131.                   mov [result.ImF.denom], ebx
  132.                     cinvoke sprintf, msg, ou,\
  133.                     [result.ReF.num],\
  134.                     [result.ReF.denom],\
  135.                     [result.ImF.num],\
  136.                     [result.ImF.denom],\
  137.                     "Substraction"
  138.                     invoke MessageBox, HWND_DESKTOP, msg, caption, 0
  139.                   ; ГОТОВО
  140.                  
  141.                 ; умножение комплексных чисел  
  142.                 mult:
  143.                   xor eax, eax
  144.                   xor ebx, ebx
  145.                   xor ecx,ecx
  146.                  
  147.                   ; cначала идет умножение вещественных и мнимыз частей
  148.                   mov eax, [cnum1.ReF.num]
  149.                   imul eax, [cnum2.ReF.num]
  150.                   mov [result.ReF.num], eax
  151.                   mov eax, [cnum1.ReF.denom]
  152.                   imul eax, [cnum2.ReF.denom]
  153.                   mov [result.ReF.denom], eax
  154.                  
  155.                   mov eax, [cnum1.ImF.num]
  156.                   imul eax, [cnum2.ImF.num]
  157.                   mov ebx, eax
  158.                   mov eax, [cnum1.ImF.denom]
  159.                   imul eax, [cnum2.ImF.denom]
  160.                   mov ecx, eax
  161.                  
  162.                   sub [result.ReF.num], ebx
  163.                   sub [result.ReF.denom], ecx
  164.                  
  165.                   xor eax, eax
  166.                   xor ebx, ebx
  167.                   xor ecx,ecx
  168.                  
  169.                   ; производим вычисления вещественное на мнимое и мнимое на вещественное
  170.                   mov eax, [cnum1.ReF.num]
  171.                   imul eax, [cnum2.ImF.num]
  172.                   mov [result.ReF.num], eax
  173.                   mov eax, [cnum1.ReF.denom]
  174.                   imul eax, [cnum2.ImF.denom]
  175.                   mov [result.ReF.denom], eax
  176.                  
  177.                   mov eax, [cnum1.ImF.num]
  178.                   imul eax, [cnum2.ReF.num]
  179.                   mov ebx, eax
  180.                   mov eax, [cnum1.ImF.denom]
  181.                   imul eax, [cnum2.ReF.denom]
  182.                   mov ecx, eax
  183.  
  184.                   add [result.ImF.num], ebx
  185.                   add [result.ImF.denom], ecx
  186.                     cinvoke sprintf, msg, ou,\
  187.                     [result.ReF.num],\
  188.                     [result.ReF.denom],\
  189.                     [result.ImF.num],\
  190.                     [result.ImF.denom],\
  191.                     "Mult"
  192.                     invoke MessageBox, HWND_DESKTOP, msg, caption, 0
  193.                   ; ГОТОВО
  194.                
  195.                 ; деление комплексных чисел происходит алгебраическим методом
  196.                 ; по формуле: http://www.webmath.ru/poleznoe/images/complex_numbers/formules_3956.png
  197.                 ; где z1 и z2 наши исходные числа, а z - результат вычислений
  198.                 divi:
  199.                   xor eax, eax
  200.                   xor ebx, ebx
  201.                   xor ecx, ecx
  202.                
  203.                 ; cначала идет умножение вещественных и мнимыз частей
  204.                   mov eax, [cnum1.ReF.num]
  205.                   imul eax, [cnum2.ReF.num]
  206.                   mov [result.ReF.num], eax
  207.                   mov eax, [cnum1.ReF.denom]
  208.                   imul eax, [cnum2.ReF.denom]
  209.                   mov [result.ReF.denom], eax
  210.                  
  211.                   mov eax, [cnum1.ImF.num]
  212.                   imul eax, [cnum2.ImF.num]
  213.                   mov ebx, eax
  214.                   mov eax, [cnum1.ImF.denom]
  215.                   imul eax, [cnum2.ImF.denom]
  216.                   mov ecx, eax
  217.                  
  218.                   add [result.ReF.num], ebx
  219.                   add [result.ReF.denom], ecx
  220.                  
  221.                   xor eax, eax
  222.                   xor ebx, ebx
  223.                   xor ecx,ecx
  224.                  
  225.                   ; производим вычисления вещественное на мнимое и мнимое на вещественное
  226.                   mov eax, [cnum1.ReF.num]
  227.                   imul eax, [cnum2.ImF.num]
  228.                   mov [result.ReF.num], eax
  229.                   mov eax, [cnum1.ReF.denom]
  230.                   imul eax, [cnum2.ImF.denom]
  231.                   mov [result.ReF.denom], eax
  232.                  
  233.                   mov eax, [cnum1.ImF.num]
  234.                   imul eax, [cnum2.ReF.num]
  235.                   mov ebx, eax
  236.                   mov eax, [cnum1.ImF.denom]
  237.                   imul eax, [cnum2.ReF.denom]
  238.                   mov ecx, eax
  239.  
  240.                   sub [result.ImF.num], ebx
  241.                   sub [result.ImF.denom], ecx
  242.                  
  243.                   xor eax, eax
  244.                   xor ebx, ebx
  245.                   xor ecx, ecx
  246.                   xor edx, edx
  247.                    
  248.                   ; посчитаем знаменатели
  249.                   mov eax, [cnum2.ReF.num]
  250.                   imul eax, eax
  251.                   mov ebx, [cnum2.ReF.denom]
  252.                   imul ebx, ebx            
  253.                   mov ecx, [cnum2.ImF.num]
  254.                   imul ecx, ecx
  255.                   mov edx, [cnum2.ImF.denom]
  256.                   imul edx, edx
  257.                   imul eax, edx
  258.                   imul ecx, ebx
  259.                  
  260.                   add eax, ecx   ; тут хранятся числитель и знаменатель            
  261.                   imul ebx, edx  ; числа из знаменателя (см. картинку по ссылке
  262.                                  ; (a^2 + b^2)
  263.                   mov ecx, [result.ReF.num]
  264.                   mov edx, [result.ReF.denom]
  265.                                  
  266.                   imul edx, eax
  267.                   imul edx, ebx
  268.                   mov [result.ReF.num], ecx
  269.                   mov [result.ReF.denom], edx
  270.                  
  271.                   mov ecx, [result.ImF.num]
  272.                   mov edx, [result.ImF.denom]
  273.                                  
  274.                   imul edx, eax
  275.                   imul edx, ebx
  276.                   mov [result.ImF.num], ecx
  277.                   mov [result.ImF.denom], edx
  278.                  
  279.                     cinvoke sprintf, msg, ou,\
  280.                     [result.ReF.num],\
  281.                     [result.ReF.denom],\
  282.                     [result.ImF.num],\
  283.                     [result.ImF.denom],\
  284.                     "division"
  285.                     invoke MessageBox, HWND_DESKTOP, msg, caption, 0
  286.                                      
  287.                   ; ГОТОВО
  288.                  
  289.                 exit:
  290.                   invoke ExitProcess,0
  291.                  
  292.                 error:
  293.                   invoke MessageBox, HWND_DESKTOP, "Incorrect input. Denom can't be zero", "Error", 0
  294.                   jmp exit
  295. ;---|--------------------|------------------------------------------------------
  296. ;---|-END CODE SECTION---|------------------------------------------------------
  297. ;---|--------------------|------------------------------------------------------
  298.  
  299. ;---|--------------------|------------------------------------------------------
  300. ;---|-IDATA SECTION------|------------------------------------------------------
  301. ;---|--------------------|------------------------------------------------------
  302. section '.idata' import data readable writeable
  303.         library KERNEL32, 'KERNEL32.DLL',\
  304.                 USER32,'USER32.DLL',\
  305.                 mscvrt,'msvcrt.DLL'
  306.  
  307.         import KERNEL32,\
  308.                ExitProcess, 'ExitProcess',\
  309.                GetCommandLine,'GetCommandLineA'
  310.  
  311.         import USER32,\
  312.                MessageBox, 'MessageBoxA'
  313.  
  314.         import mscvrt,\
  315.                sprintf,'sprintf',\
  316.                sscanf, 'sscanf'
  317. ;---|--------------------|------------------------------------------------------
  318. ;---|-END IDATA SECTION--|------------------------------------------------------
  319. ;---|--------------------|------------------  ----------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement