@@ -13,21 +13,21 @@ _start:
1313
1414
1515
16- sub rsp , 2 * 128 * 8 ; выделяем место под ответ
17- mov r10 , rsp
16+ sub rsp , 2 * 128 * 8 ; выделяем место под ответ
17+ mov r10 , rsp
1818
19- push rdi
20- mov rcx , 256
21- mov rdi , r10
22- call set_zero ; нужно занулить место под ответ
23- mov rcx , 128
24- pop rdi
19+ push rdi
20+ mov rcx , 256
21+ mov rdi , r10
22+ call set_zero ; нужно занулить место под ответ
23+ mov rcx , 128
24+ pop rdi
2525
2626 call mul_long_long
2727
2828
29- mov rcx , 256 ; подготовим регистры и выведем ответ
30- mov rdi , r10
29+ mov rcx , 256 ; подготовим регистры и выведем ответ
30+ mov rdi , r10
3131 call write_long
3232
3333 mov al , 0x0a
@@ -46,65 +46,65 @@ mul_long_long:
4646 push rsi
4747 push rcx
4848
49- push rax
50- push rbx
51- push rbp
52- push r8
53- push r9
49+ push rax
50+ push rbx
51+ push rbp
52+ push r8
53+ push r9
5454
5555; далее просто перебираем разряды обоих чисел, умножаем и прибавляем к результату
5656
57- xor r8 , r8
58- loop_outer:
57+ xor r8 , r8
58+ loop_outer:
5959
6060
61- xor r9 , r9
61+ xor r9 , r9
6262loop_inner:
6363
6464 ;
6565 ; [r10 + 8 * (r8 + r9)] += [rdi + 8 * r8] * [rsi + 8 * r9] грубо говоря
6666 ;
6767
68- lea rax , [ rdi + 8 * r8 ]
69- mov rax , [ rax ] ; грубо превратили индекс в значение, ну да ладно
70- lea rbx , [ rsi + 8 * r9 ]
71- mov rbx , [ rbx ]
68+ lea rax , [ rdi + 8 * r8 ]
69+ mov rax , [ rax ] ; грубо превратили индекс в значение, ну да ладно
70+ lea rbx , [ rsi + 8 * r9 ]
71+ mov rbx , [ rbx ]
7272
7373
74- ; high:low
75- mul rbx ; rdx:rax = rax * rbx
76-
77- mov rbp , r8
78- add rbp , r9 ; rbp = r8 + r9
79- lea rbp , [ r10 + 8 * rbp ] ; rbp - индекс, куда надо прибавлять
74+ ; high:low
75+ mul rbx ; rdx:rax = rax * rbx
76+
77+ mov rbp , r8
78+ add rbp , r9 ; rbp = r8 + r9
79+ lea rbp , [ r10 + 8 * rbp ] ; rbp - индекс, куда надо прибавлять
8080
8181
82- add [ rbp ], rax ; прибавляем и ставим CF
83- lea rbp , [ rbp + 8 ]
84- adc [ rbp ], rdx ; снова керри флаг
82+ add [ rbp ], rax ; прибавляем и ставим CF
83+ lea rbp , [ rbp + 8 ]
84+ adc [ rbp ], rdx ; снова керри флаг
8585while_carry:
86- jnc end_of_while ; если CF = 0 то конец
87- lea rbp , [ rbp + 8 ]
88- adc QWORD [ rbp ], 0
89- jmp while_carry
86+ jnc end_of_while ; если CF = 0 то конец
87+ lea rbp , [ rbp + 8 ]
88+ adc QWORD [ rbp ], 0
89+ jmp while_carry
9090end_of_while:
91-
91+
9292
93- inc r9
94- cmp rcx , r9
95- ja loop_inner
93+ inc r9
94+ cmp rcx , r9
95+ ja loop_inner
9696
9797
98- inc r8
99- cmp rcx , r8
100- ja loop_outer
98+ inc r8
99+ cmp rcx , r8
100+ ja loop_outer
101101
102102
103- pop r9
104- pop r8
105- pop rbp
106- pop rbx
107- pop rax
103+ pop r9
104+ pop r8
105+ pop rbp
106+ pop rbx
107+ pop rax
108108
109109 pop rcx
110110 pop rsi
0 commit comments