Дали задание, чтобы расчёт дискриминантов проводился на ассемблере и подключался к основному проекту
| 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
| format PE64 GUI 5.0 DLL
entry DllEntryPoint
include 'win64a.inc'
section '.text' code readable executable
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
mov eax, TRUE
ret
endp
b equ xmm0 ;регистр с плавающей точкой
a equ xmm1
c equ xmm2
d equ xmm3
getCubicD0asm:
; b^2 - 3 * a * c
mulsd a, c ;скалярный дабл a = a * c
mulsd b, b ; b = b * b
movsd c, a ; c = a * c
addsd c, a ; c = 2 * a * c
addsd c, a ; c = 3 * a * c
subsd b, c ; b = b * b - 3 * a * c
ret
getCubicD1asm:
; 2 * b^3 - 9 * a * b * c + 27 * a^2 * d
mulsd d, a ; d = a * d
mulsd d, a ; d = a^2 * d
mulsd a, b ; a = a * b
mulsd a, c ; a = a * b * c
mov eax, 9
cvtsi2sd c, eax ; конвертируем eax в double и записываем в c c=9
mulsd a, c ; a = 9 * a * b * c
mov eax, 27
cvtsi2sd c, eax ; c = 27
mulsd d, c ; d = 27 * a^2 * d
movsd c, b ; c = b
mulsd b, c
mulsd b, c ; b = b^3
addsd b, b ; b = 2 * b^3
subsd b, a ; b = 2* b^3 - 9 * a * b * c
addsd b, d ; b = 2 * b^3 - 9 * a * b * c + 27 * a^2 * d
ret
section '.edata' export data readable
export 'CubicD.DLL',\
getCubicD0asm, 'getCubicD0asm',\
getCubicD1asm, 'getCubicD1asm'
section '.reloc' fixups data discardable |
|
| C# | 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
| using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;
using System.Windows.Forms;
namespace Cubic
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
double a, b, c, d, d0, d1;
Complex C;
Complex x1, x2, x3;
Complex xi = -3;
a = b = c = 1;
d = -10;
xi = (-1 + Complex.Sqrt(xi)) / 2;
d0 = GetCubicD0(b, a, c);
d1 = GetCubicD1(b, a, c, d);
//d0 = GetCubicD0asm(b, a, c);
//d1 = GetCubicD1asm(b, a, c, d);
if (d0 == 0 && d1 == 0)
x1 = x2 = x3 = -b / (3 * a);
else
{
C = Math.Pow(d1, 2) - 4 * Math.Pow(d0, 3);
C = (d1 + Complex.Sqrt(C)) / 2;
C = Complex.Pow(C, 1.0 / 3.0);
x1 = -((b + C + d0 / C) / (3 * a));
x2 = -((b + C * xi + d0 / (C * xi)) / (3 * a));
x3 = -((b + C * xi * xi + d0 / (C * xi * xi)) / (3 * a));
}
C = a * Complex.Pow(x1, 3) + b * Complex.Pow(x1, 2) + c * x1 + d; //Вывести на формулу 1 * x1^3 + 1 * x1^2 + 1 + x1 + (-10) = C;
C = a * Complex.Pow(x2, 3) + b * Complex.Pow(x2, 2) + c * x2 + d;
C = a * Complex.Pow(x3, 3) + b * Complex.Pow(x3, 2) + c * x3 + d;
}
private double GetCubicD0(double b, double a, double c)
{
return Math.Pow(b, 2) - 3 * a * c;
}
private double GetCubicD1(double b, double a, double c, double d)
{
return 2 * Math.Pow(b, 3) - 9 * a * b * c + 27 * Math.Pow(a, 2) * d;
}
}
} |
|
Из ассемблерного кода сделала dll и теперь не знаю как подключить её к C#. При добавлении через ссылки выдаёт ошибку "Убедитесь, что файл доступен, и является допустимой сборкой или компонентом COM"
|