Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- format PE GUI 4.0
- entry start
- include 'win32ax.inc'
- ;_________________
- ; |
- ; Made by |
- ; Vladimir |
- ; Tikhomirov |
- ; БПИ171 |
- ; Вариант 16 |
- ;_________________|
- ;---|--------------------|------------------------------------------------------
- ;---|-DATA SECTION-------|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- section '.data' data readable writeable
- caption db 'Result', 0
- msg db 256 dup ? ; сообщение для вывода
- CommadLineLink dd ? ; ссылка на командную строку
- ou db "(%d/%d) + (%d/%d)i",13,10
- db "operatoin: %s",13,10
- ; Структура, представляющая собой дробное число
- struct fraction
- num dd ?
- denom dd ?
- ends
- ; представляет собой простое комплексное число, состоящиее
- ; из действительной и мнимой части
- struct compn
- ReF fraction ; действительная часть комплексного числа в виде
- ;дроби
- ImF fraction ; мнимая часть комплексного числа в виде дроби
- ends
- ; комплексные числа над которыми будут проводитьяс операции
- cnum1 compn
- cnum2 compn
- result compn ; результат вычислений
- ;---|--------------------|------------------------------------------------------
- ;---|-END DATA SECTION---|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- ;---|-CODE SECTION-------|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- section '.code' code readable writeable executable
- start:
- cinvoke GetCommandLine ; записываем в eax ссылку на cmd
- mov [CommadLineLink], eax ; копируем ссылку в переменную cmdlk
- cinvoke sscanf, [CommadLineLink], "%*s %d/%d %d/%d %d/%d %d/%d",\
- cnum1.ReF.num,\
- cnum1.ReF.denom,\
- cnum1.ImF.num,\
- cnum1.ImF.denom,\
- cnum2.ReF.num,\
- cnum2.ReF.denom,\
- cnum2.ImF.num,\
- cnum2.ImF.denom
- cmp [cnum1.ReF.denom], 0
- je error
- cmp [cnum1.ImF.denom], 0
- je error
- cmp [cnum2.ReF.denom], 0
- je error
- cmp [cnum2.ImF.denom], 0
- je error
- addition:
- xor eax, eax
- xor ebx, ebx
- mov ebx, [cnum1.ReF.num] ; записываем значение числителя
- ; вещ. части комп. числа в ebx
- imul ebx, [cnum2.ReF.denom]; умножаем на знаменатель второго
- mov [result.ReF.num], ebx ; копируем значение в результат
- mov ebx, [cnum2.ReF.num] ; аналогично для второго числа
- imul ebx, [cnum1.ReF.denom] ; перемножаем их и перезаписываем ebx
- add [result.ReF.num], ebx ; записываем(складывая) результат вычислений в result
- mov ebx, [cnum1.ReF.denom] ; записывам знаменатель первого числа в ebx
- imul ebx, [cnum2.ReF.denom] ; перемножаем знаменатели обоих дробей
- mov [result.ReF.denom], ebx ; записываем знаменатель в result
- mov ebx, [cnum1.ImF.num] ; Аналогичные действия для мнимых
- imul ebx, [cnum2.ImF.denom] ; Частей комплексных чисел
- mov [result.ImF.num], ebx ;
- mov ebx, [cnum2.ImF.num] ;
- imul ebx, [cnum1.ImF.denom] ;
- add [result.ImF.num], ebx ;
- mov ebx, [cnum1.ImF.denom] ;
- imul ebx, [cnum2.ImF.denom] ;
- mov [result.ImF.denom], ebx ;
- cinvoke sprintf, msg, ou,\
- [result.ReF.num],\
- [result.ReF.denom],\
- [result.ImF.num],\
- [result.ImF.denom],\
- "Add"
- invoke MessageBox, HWND_DESKTOP, msg, caption, 0
- ; ГОТОВО
- ; Операция вычитания аналогична сложению, за одним маленьким
- ; исключением
- substr:
- xor ebx, ebx
- xor eax,eax
- mov ebx, [cnum1.ReF.num]
- imul ebx, [cnum2.ReF.denom]
- mov [result.ReF.num], ebx
- mov ebx, [cnum2.ReF.num]
- imul ebx, [cnum1.ReF.denom]
- sub [result.ReF.num], ebx ; все тоже самое за исключением вычитания
- mov ebx, [cnum1.ReF.denom]
- imul ebx, [cnum2.ReF.denom]
- mov [result.ReF.denom], ebx
- mov ebx, [cnum1.ImF.num]
- imul ebx, [cnum2.ImF.denom]
- mov [result.ImF.num], ebx
- mov ebx, [cnum2.ImF.num]
- imul ebx, [cnum1.ImF.denom]
- sub [result.ImF.num], ebx
- mov ebx, [cnum1.ImF.denom]
- imul ebx, [cnum2.ImF.denom]
- mov [result.ImF.denom], ebx
- cinvoke sprintf, msg, ou,\
- [result.ReF.num],\
- [result.ReF.denom],\
- [result.ImF.num],\
- [result.ImF.denom],\
- "Substraction"
- invoke MessageBox, HWND_DESKTOP, msg, caption, 0
- ; ГОТОВО
- ; умножение комплексных чисел
- mult:
- xor eax, eax
- xor ebx, ebx
- xor ecx,ecx
- ; cначала идет умножение вещественных и мнимыз частей
- mov eax, [cnum1.ReF.num]
- imul eax, [cnum2.ReF.num]
- mov [result.ReF.num], eax
- mov eax, [cnum1.ReF.denom]
- imul eax, [cnum2.ReF.denom]
- mov [result.ReF.denom], eax
- mov eax, [cnum1.ImF.num]
- imul eax, [cnum2.ImF.num]
- mov ebx, eax
- mov eax, [cnum1.ImF.denom]
- imul eax, [cnum2.ImF.denom]
- mov ecx, eax
- sub [result.ReF.num], ebx
- sub [result.ReF.denom], ecx
- xor eax, eax
- xor ebx, ebx
- xor ecx,ecx
- ; производим вычисления вещественное на мнимое и мнимое на вещественное
- mov eax, [cnum1.ReF.num]
- imul eax, [cnum2.ImF.num]
- mov [result.ReF.num], eax
- mov eax, [cnum1.ReF.denom]
- imul eax, [cnum2.ImF.denom]
- mov [result.ReF.denom], eax
- mov eax, [cnum1.ImF.num]
- imul eax, [cnum2.ReF.num]
- mov ebx, eax
- mov eax, [cnum1.ImF.denom]
- imul eax, [cnum2.ReF.denom]
- mov ecx, eax
- add [result.ImF.num], ebx
- add [result.ImF.denom], ecx
- cinvoke sprintf, msg, ou,\
- [result.ReF.num],\
- [result.ReF.denom],\
- [result.ImF.num],\
- [result.ImF.denom],\
- "Mult"
- invoke MessageBox, HWND_DESKTOP, msg, caption, 0
- ; ГОТОВО
- ; деление комплексных чисел происходит алгебраическим методом
- ; по формуле: http://www.webmath.ru/poleznoe/images/complex_numbers/formules_3956.png
- ; где z1 и z2 наши исходные числа, а z - результат вычислений
- divi:
- xor eax, eax
- xor ebx, ebx
- xor ecx, ecx
- ; cначала идет умножение вещественных и мнимыз частей
- mov eax, [cnum1.ReF.num]
- imul eax, [cnum2.ReF.num]
- mov [result.ReF.num], eax
- mov eax, [cnum1.ReF.denom]
- imul eax, [cnum2.ReF.denom]
- mov [result.ReF.denom], eax
- mov eax, [cnum1.ImF.num]
- imul eax, [cnum2.ImF.num]
- mov ebx, eax
- mov eax, [cnum1.ImF.denom]
- imul eax, [cnum2.ImF.denom]
- mov ecx, eax
- add [result.ReF.num], ebx
- add [result.ReF.denom], ecx
- xor eax, eax
- xor ebx, ebx
- xor ecx,ecx
- ; производим вычисления вещественное на мнимое и мнимое на вещественное
- mov eax, [cnum1.ReF.num]
- imul eax, [cnum2.ImF.num]
- mov [result.ReF.num], eax
- mov eax, [cnum1.ReF.denom]
- imul eax, [cnum2.ImF.denom]
- mov [result.ReF.denom], eax
- mov eax, [cnum1.ImF.num]
- imul eax, [cnum2.ReF.num]
- mov ebx, eax
- mov eax, [cnum1.ImF.denom]
- imul eax, [cnum2.ReF.denom]
- mov ecx, eax
- sub [result.ImF.num], ebx
- sub [result.ImF.denom], ecx
- xor eax, eax
- xor ebx, ebx
- xor ecx, ecx
- xor edx, edx
- ; посчитаем знаменатели
- mov eax, [cnum2.ReF.num]
- imul eax, eax
- mov ebx, [cnum2.ReF.denom]
- imul ebx, ebx
- mov ecx, [cnum2.ImF.num]
- imul ecx, ecx
- mov edx, [cnum2.ImF.denom]
- imul edx, edx
- imul eax, edx
- imul ecx, ebx
- add eax, ecx ; тут хранятся числитель и знаменатель
- imul ebx, edx ; числа из знаменателя (см. картинку по ссылке
- ; (a^2 + b^2)
- mov ecx, [result.ReF.num]
- mov edx, [result.ReF.denom]
- imul edx, eax
- imul edx, ebx
- mov [result.ReF.num], ecx
- mov [result.ReF.denom], edx
- mov ecx, [result.ImF.num]
- mov edx, [result.ImF.denom]
- imul edx, eax
- imul edx, ebx
- mov [result.ImF.num], ecx
- mov [result.ImF.denom], edx
- cinvoke sprintf, msg, ou,\
- [result.ReF.num],\
- [result.ReF.denom],\
- [result.ImF.num],\
- [result.ImF.denom],\
- "division"
- invoke MessageBox, HWND_DESKTOP, msg, caption, 0
- ; ГОТОВО
- exit:
- invoke ExitProcess,0
- error:
- invoke MessageBox, HWND_DESKTOP, "Incorrect input. Denom can't be zero", "Error", 0
- jmp exit
- ;---|--------------------|------------------------------------------------------
- ;---|-END CODE SECTION---|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- ;---|-IDATA SECTION------|------------------------------------------------------
- ;---|--------------------|------------------------------------------------------
- section '.idata' import data readable writeable
- library KERNEL32, 'KERNEL32.DLL',\
- USER32,'USER32.DLL',\
- mscvrt,'msvcrt.DLL'
- import KERNEL32,\
- ExitProcess, 'ExitProcess',\
- GetCommandLine,'GetCommandLineA'
- import USER32,\
- MessageBox, 'MessageBoxA'
- import mscvrt,\
- sprintf,'sprintf',\
- sscanf, 'sscanf'
- ;---|--------------------|------------------------------------------------------
- ;---|-END IDATA SECTION--|------------------------------------------------------
- ;---|--------------------|------------------ ----------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement