From 7720e38868c49aa72c0b97f4f66ceb2de49069a9 Mon Sep 17 00:00:00 2001 From: IgorA Date: Sat, 22 Mar 2025 08:37:30 +0200 Subject: [PATCH] NNP: removed dependency on libc library, clean code --- programs/develop/libraries/nnp/nnp.asm | 442 ++++++++++++------------- 1 file changed, 205 insertions(+), 237 deletions(-) diff --git a/programs/develop/libraries/nnp/nnp.asm b/programs/develop/libraries/nnp/nnp.asm index b874c9c1f..f43f95643 100644 --- a/programs/develop/libraries/nnp/nnp.asm +++ b/programs/develop/libraries/nnp/nnp.asm @@ -32,7 +32,6 @@ section '.flat' code readable align 16 include "..\..\..\KOSfuncs.inc" include "..\..\..\proc32.inc" include "..\..\..\macros.inc" -include "..\..\..\dll.inc" include "..\..\..\bcc32\include\kos_func.inc" include "..\..\..\bcc32\include\kos_heap.inc" @@ -44,9 +43,9 @@ include "..\..\..\bcc32\include\kos_heap.inc" @@StrToInt$qpc equ @StrToInt$qpc @@StrToDouble$qpc equ @StrToDouble$qpc -mem.alloc dd ? ;функция для выделения памяти -mem.free dd ? ;функция для освобождения памяти -mem.realloc dd ? ;функция для перераспределения памяти +mem.alloc dd ? ;memory allocation function +mem.free dd ? ;function to free up memory +mem.realloc dd ? ;function for memory reallocation dll.load dd ? PRECISION equ 16 @@ -54,20 +53,20 @@ NNP_FF_BIN equ 0x6e6962 NNP_FF_JSON equ 0x6e6f736a struct Layer - c_size dd ? ;+ 0 curent size - число нейронов в текущем слое - n_size dd ? ;+ 4 next size - число нейронов на следующем слое + c_size dd ? ;+ 0 curent size - number of neurons in the current layer + n_size dd ? ;+ 4 next size - number of neurons in the next layer neurons dd ? ;+ 8 [] biases dd ? ;+12 [] weights dd ? ;+16 [][] ends struct NeuralNetwork - learningRate dq ? ;+ 0 скорость обучения - layers dd ? ;+ 8 [] слои - layers_length dd ? ;+12 число слоев - activation dd ? ;+16 указатель на функцию активации - derivative dd ? ;+20 указатель на функцию - errors dd ? ;+24 массив для вычислений + learningRate dq ? ;+ 0 + layers dd ? ;+ 8 [] + layers_length dd ? ;+12 number of layers + activation dd ? ;+16 pointer to activation function + derivative dd ? ;+20 function pointer + errors dd ? ;+24 array for calculations errorsNext dd ? ;+28 gradients dd ? ;+32 deltas dd ? ;+36 @@ -113,11 +112,6 @@ proc lib_init mov [mem.free], ebx mov [mem.realloc], ecx mov [dll.load], edx - - or edx, edx - jz @f - invoke dll.load, @IMPORT -@@: ret endp @@ -137,6 +131,21 @@ Math_random: @@: db 0,0,128,55 ;dd 1.0/65536.0 +align 16 +ieee754_exp: + fld qword[esp+4] + fldl2e ;push log2(e) onto stack + fmulp + fst st1 ;copies st0 to st1 + frndint ;round to integer + fst st2 ;copies st0 to st2 + fsubp ;subtraction with stack pop + f2xm1 ;raises 2 to the power st0 and subtracts 1 + fld1 + faddp + fscale ;scale by powers of two + ret + align 16 sigmoid: push ebp @@ -145,7 +154,7 @@ sigmoid: fld qword[ebp+8] fchs fstp qword[esp] - call dword[_exp] + call ieee754_exp add esp,8 fadd dword[f_1_0] fdivr dword[f_1_0] @@ -190,7 +199,7 @@ Layer_Create: mov dword[esi+Layer.weights],eax xor ebx,ebx cmp edi,ebx - jbe .end_f + jbe .end_f @@: mov eax,[ebp+16] shl eax,3 @@ -250,18 +259,18 @@ NNP_Create: mov eax,[ebp+28] ;sizes lea edx,[eax+4] mov dword[ebp-8],edx ;save &sizes[i+1] - jmp .150 + jmp .3 .cycle_0: ;for (i=0; i < sizes_length; i++) xor ecx,ecx mov dword[ebp-4],ecx ;nextSize = 0 mov eax,[ebp+32] ;sizes_length dec eax cmp edi,eax - jae .152 + jae @f mov edx,[ebp-8] mov ecx,[edx] mov dword[ebp-4],ecx ;nextSize = sizes[i+1] -.152: +@@: mov eax,[ebp-4] push eax mov edx,[ebp-8] @@ -277,7 +286,7 @@ NNP_Create: mov eax,[ebp-8] lea edx,[eax-4] mov dword[ebp-12],edx ;save &sizes[i] - jmp .154 + jmp .2 .cycle_1: ;for (j=0; j < sizes[i]; j++) call Math_random fmul dword[f_2_0] @@ -290,7 +299,7 @@ NNP_Create: fstp qword[ecx+8*esi] xor ebx,ebx ;k=0 cmp ebx,[ebp-4] - jae .157 + jae .1 @@: ;for (k=0; k < nextSize; k++) call Math_random fmul dword[f_2_0] @@ -305,15 +314,15 @@ NNP_Create: inc ebx cmp ebx,[ebp-4] jb @b -.157: +.1: inc esi -.154: +.2: mov ecx,[ebp-12] cmp esi,[ecx] jb .cycle_1 inc edi add dword[ebp-8],4 -.150: +.3: cmp edi,[ebp+32] ;sizes_length jb .cycle_0 ;create errors array @@ -349,7 +358,7 @@ f_2_0: f_1_0: dd 1.0 -;заполнение случайными числами +;random number filling ;+ 8 NeuralNetwork* o align 16 NNP_Reset: @@ -413,7 +422,7 @@ NNP_Reset: pop ebp ret 4 -;расчет входных и выходных нейронов +;calculation of input and output neurons ;+ 8 NeuralNetwork* o ;+12 double* inputs align 16 @@ -508,7 +517,7 @@ NNP_BackPropagation: add edi,[esi+NeuralNetwork.layers] xor ebx,ebx ;i=0 mov eax,[ebp+12] ;eax = targets[] - jmp .180 + jmp .1 align 4 .cycle_0: mov edx,[edi+Layer.neurons] @@ -518,7 +527,7 @@ align 4 fstp qword[ecx+8*ebx] inc ebx add eax,8 -.180: +.1: cmp ebx,[edi+Layer.c_size] jb .cycle_0 dec dword[ebp-4] ;k-- @@ -528,7 +537,7 @@ align 4 .cycle_1: sub edi,sizeof.Layer xor ebx,ebx ;i=0 - jmp .186 + jmp .2 align 4 .cycle_2: mov eax,[edi+sizeof.Layer+Layer.neurons] @@ -541,12 +550,12 @@ align 4 mov edx,[esi+NeuralNetwork.gradients] fstp qword[edx+8*ebx] inc ebx -.186: +.2: cmp ebx,[edi+sizeof.Layer+Layer.c_size] jb .cycle_2 mov edx,[esi+NeuralNetwork.deltas] xor ebx,ebx - jmp .189 + jmp .3 align 4 .cycle_3: mov eax,[edi+Layer.c_size] @@ -556,7 +565,7 @@ align 4 pop ecx mov dword[edx],eax xor eax,eax ;j=0 - jmp .191 + jmp @f align 4 .cycle_4: mov ecx,[esi+NeuralNetwork.gradients] @@ -566,16 +575,16 @@ align 4 mov ecx,[edx] fstp qword[ecx+8*eax] inc eax -.191: +@@: cmp eax,[edi+Layer.c_size] jb .cycle_4 inc ebx add edx,4 -.189: +.3: cmp ebx,[edi+sizeof.Layer+Layer.c_size] jb .cycle_3 xor ebx,ebx - jmp .195 + jmp .4 align 4 .cycle_5: mov eax,[esi+NeuralNetwork.errorsNext] @@ -583,7 +592,7 @@ align 4 mov dword[eax+8*ebx],edx mov dword[eax+8*ebx+4],edx xor eax,eax ;j=0 - jmp .197 + jmp @f align 4 .cycle_6: mov edx,[edi+Layer.weights] @@ -595,11 +604,11 @@ align 4 fadd qword[ecx+8*ebx] fstp qword[ecx+8*ebx] inc eax -.197: +@@: cmp eax,[edi+sizeof.Layer+Layer.c_size] jb .cycle_6 inc ebx -.195: +.4: cmp ebx,[edi] jb .cycle_5 ;copy errors to next level @@ -610,7 +619,7 @@ align 4 mov eax,[esi+NeuralNetwork.deltas] mov dword[ebp-12],eax xor ebx,ebx ;i=0 - jmp .201 + jmp .6 align 4 .cycle_7: mov ecx,[esi+NeuralNetwork.gradients] @@ -620,7 +629,7 @@ align 4 fstp qword[eax+8*ebx] xor eax,eax ;j=0 mov edx,[ebp-12] ;edx = deltas[i] - jmp .203 + jmp .5 align 4 .cycle_8: ; mov ecx,[edx] @@ -656,7 +665,7 @@ align 4 ; pop edx ;@@: inc eax -.203: +.5: cmp eax,[edi+Layer.c_size] jb .cycle_8 mov eax,[ebp-12] @@ -664,7 +673,7 @@ align 4 pop ecx inc ebx add dword[ebp-12],4 -.201: +.6: cmp ebx,[edi+sizeof.Layer+Layer.c_size] jb .cycle_7 dec dword[ebp-4] @@ -693,8 +702,7 @@ NNP_GetMemData: jne .end_f mov esi,[ebp+16] mov byte[esi],0 - stdcall [_strcat], esi,txt_QlearningRateQ_ - add esp,8 + stdcall str_cat, esi,txt_QlearningRateQ_ push 1 push PRECISION mov eax,[ebp+8] @@ -702,12 +710,9 @@ NNP_GetMemData: push dword[eax+NeuralNetwork.learningRate] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 - stdcall [_strcat], esi,txt_zap_nl - add esp,8 - stdcall [_strcat], esi,txt_Qlayers_lengthQ - add esp,8 + stdcall str_cat, esi,eax + stdcall str_cat, esi,txt_zap_nl + stdcall str_cat, esi,txt_Qlayers_lengthQ push 1 push 0 mov ecx,[ebp+8] @@ -716,23 +721,18 @@ NNP_GetMemData: fstp qword[esp] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 - stdcall [_strcat], esi,txt_zap_nl - add esp,8 -.230: - stdcall [_strcat], esi,txt_QlayersQ - add esp,8 + stdcall str_cat, esi,eax + stdcall str_cat, esi,txt_zap_nl + stdcall str_cat, esi,txt_QlayersQ xor edi,edi ;i=0 - jmp .232 + jmp .7 align 4 .cycle_0: push esi call @@strlen$qpxc pop ecx add esi,eax - stdcall [_strcat], esi,txt_nl_t_Qc_sizeQ - add esp,8 + stdcall str_cat, esi,txt_nl_t_Qc_sizeQ mov ebx,edi imul ebx,sizeof.Layer push 1 @@ -748,10 +748,8 @@ align 4 fstp qword[esp] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 - stdcall [_strcat], esi,txt_zap_nl_t_Qn_sizeQ - add esp,8 + stdcall str_cat, esi,eax + stdcall str_cat, esi,txt_zap_nl_t_Qn_sizeQ push 1 push 0 mov ecx,[ebp+8] @@ -765,21 +763,17 @@ align 4 fstp qword[esp] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 - stdcall [_strcat], esi,txt_zap_nl - add esp,8 - stdcall [_strcat], esi,txt_t_QneuronsQ - add esp,8 + stdcall str_cat, esi,eax + stdcall str_cat, esi,txt_zap_nl + stdcall str_cat, esi,txt_t_QneuronsQ xor ebx,ebx ;j=0 - jmp .234 + jmp .1 align 4 .cycle_1: test ebx,ebx - je .235 - stdcall [_strcat], esi,txt_zap_sp - add esp,8 -.235: + je @f + stdcall str_cat, esi,txt_zap_sp +@@: push 1 push PRECISION mov eax,edi @@ -791,29 +785,25 @@ align 4 push dword[eax+8*ebx] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 + stdcall str_cat, esi,eax inc ebx -.234: +.1: mov ecx,edi imul ecx,sizeof.Layer mov eax,[ebp+8] add ecx,[eax+NeuralNetwork.layers] cmp ebx,[ecx+Layer.c_size] jb .cycle_1 - stdcall [_strcat], esi,txt_sqbr_zap_nl - add esp,8 - stdcall [_strcat], esi,txt_t_QbiasesQ - add esp,8 + stdcall str_cat, esi,txt_sqbr_zap_nl + stdcall str_cat, esi,txt_t_QbiasesQ xor ebx,ebx ;j=0 - jmp .238 + jmp .2 align 4 .cycle_2: test ebx,ebx - je .239 - stdcall [_strcat], esi,txt_zap_sp - add esp,8 -.239: + je @f + stdcall str_cat, esi,txt_zap_sp +@@: push 1 push PRECISION mov eax,edi @@ -825,43 +815,38 @@ align 4 push dword[eax+8*ebx] call @@DoubleToStr$qduso add esp,16 - stdcall [_strcat], esi,eax - add esp,8 + stdcall str_cat, esi,eax inc ebx -.238: +.2: mov ecx,edi imul ecx,sizeof.Layer mov eax,[ebp+8] add ecx,[eax+NeuralNetwork.layers] cmp ebx,[ecx+Layer.c_size] jb .cycle_2 - stdcall [_strcat], esi,txt_sqbr_zap_t_QweightsQ - add esp,8 + stdcall str_cat, esi,txt_sqbr_zap_t_QweightsQ mov eax,[ebp+8] mov ecx,edi imul ecx,sizeof.Layer add ecx,[eax+NeuralNetwork.layers] cmp dword[ecx+Layer.n_size],0 - je .241 + je .6 xor ebx,ebx - jmp .243 -.242: + jmp .5 +.cycle_3: test ebx,ebx - je .244 - stdcall [_strcat], esi,txt_zap_nl_t_t - add esp,8 -.244: - stdcall [_strcat], esi,txt_sqbro - add esp,8 + je @f + stdcall str_cat, esi,txt_zap_nl_t_t +@@: + stdcall str_cat, esi,txt_sqbro xor eax,eax mov dword[ebp-4],eax - jmp .246 -.245: + jmp .4 +.3: cmp dword[ebp-4],0 - je .247 - stdcall [_strcat], esi,txt_zap_sp - add esp,8 -.247: + je @f + stdcall str_cat, esi,txt_zap_sp +@@: push 1 push PRECISION mov edx,edi @@ -875,43 +860,39 @@ align 4 push dword[ecx+8*eax] @@: call @@DoubleToStr$qduso - dec dword[esp+8] ;уменьшаем PRECISION - jz @f ;для избежания зацикливания + dec dword[esp+8] ;decrease PRECISION + jz @f ;to avoid looping cmp word[eax],'#' - je @b ;если число не поместилось пробуем перевести с меньшей точностью + je @b ;if the number does not fit, we try to translate with less precision @@: add esp,16 - stdcall [_strcat], esi,eax - add esp,8 + stdcall str_cat, esi,eax inc dword[ebp-4] -.246: +.4: mov ecx,edi imul ecx,sizeof.Layer mov eax,[ebp+8] add ecx,[eax+NeuralNetwork.layers] mov ecx,[ecx+Layer.n_size] cmp ecx,[ebp-4] - ja .245 - stdcall [_strcat], esi,txt_sqbr - add esp,8 + ja .3 + stdcall str_cat, esi,txt_sqbr inc ebx -.243: +.5: mov eax,edi imul eax,sizeof.Layer mov ecx,[ebp+8] add eax,[ecx+NeuralNetwork.layers] cmp ebx,[eax+Layer.c_size] - jb .242 -.241: - stdcall [_strcat], esi,txt_sqbr_fbr_zap - add esp,8 + jb .cycle_3 +.6: + stdcall str_cat, esi,txt_sqbr_fbr_zap inc edi -.232: +.7: mov eax,[ebp+8] cmp edi,[eax+NeuralNetwork.layers_length] jb .cycle_0 - stdcall [_strcat], esi,txt_nl_t_sqbr - add esp,8 + stdcall str_cat, esi,txt_nl_t_sqbr .end_f: pop edi esi ebx mov esp,ebp @@ -963,12 +944,11 @@ NNP_SetMemData: mov eax,[ebp+16] mov edx,[ebp+12] ; cmp edx,NNP_FF_BIN -; jne .191 +; jne @f ;... -;.191: +;@@: cmp edx,NNP_FF_JSON - jne .198 -.199: + jne .9 stdcall @@strstr$qpxct1, eax,txt_learningRate add esp,8 mov esi,eax @@ -976,27 +956,27 @@ NNP_SetMemData: add esp,8 mov esi,eax test esi,esi - jne .200 + jne @f mov eax,1 - jmp .193 -.200: + jmp .end_f +@@: stdcall @@strchr$qpxci, esi,':' add esp,8 mov ebx,eax test ebx,ebx - jne .201 + jne @f mov eax,2 - jmp .193 -.201: + jmp .end_f +@@: inc ebx stdcall @@strchr$qpxci, esi,',' add esp,8 mov esi,eax test esi,esi - jne .202 + jne @f mov eax,3 - jmp .193 -.202: + jmp .end_f +@@: mov byte[esi],0 inc esi stdcall @@StrToInt$qpc, ebx @@ -1008,38 +988,38 @@ NNP_SetMemData: mov eax,[ebp+8] mov edx,[eax+12] cmp edx,[ebp-4] - je .203 + je @f mov eax,txt_err_layers_neq - jmp .193 -.203: + jmp .end_f +@@: xor edi,edi ;i=0 - jmp .205 -.204: ;for(i=0;ilayers_length;i++) + jmp .8 +.cycle_0: ;for(i=0;ilayers_length;i++) stdcall @@strstr$qpxct1, esi,txt_c_size add esp,8 mov esi,eax test esi,esi - jne .206 + jne @f mov eax,txt_err_c_size - jmp .193 -.206: + jmp .end_f +@@: stdcall @@strchr$qpxci, esi,':' add esp,8 mov ebx,eax test ebx,ebx - jne .207 + jne @f mov eax,6 - jmp .193 -.207: + jmp .end_f +@@: inc ebx stdcall @@strchr$qpxci, esi,',' add esp,8 mov esi,eax test esi,esi - jne .208 + jne @f mov eax,7 - jmp .193 -.208: + jmp .end_f +@@: mov byte[esi],0 inc esi stdcall @@StrToInt$qpc, ebx @@ -1049,27 +1029,27 @@ NNP_SetMemData: add esp,8 mov esi,eax test esi,esi - jne .209 + jne @f mov eax,8 - jmp .193 -.209: + jmp .end_f +@@: stdcall @@strchr$qpxci, esi,':' add esp,8 mov ebx,eax test ebx,ebx - jne .210 + jne @f mov eax,9 - jmp .193 -.210: + jmp .end_f +@@: inc ebx stdcall @@strchr$qpxci, esi,',' add esp,8 mov esi,eax test esi,esi - jne .211 + jne @f mov eax,10 - jmp .193 -.211: + jmp .end_f +@@: mov byte[esi],0 inc esi stdcall @@StrToInt$qpc,ebx @@ -1081,11 +1061,11 @@ NNP_SetMemData: add eax,[edx+NeuralNetwork.layers] mov edx,[eax+Layer.c_size] cmp edx,[ebp-4] - jne .213 + jne @f mov edx,[eax+Layer.n_size] cmp edx,[ebp-8] - je .214 -.213: + je .1 +@@: mov ecx,[ebp+8] stdcall NNP_GetMaxLLen,ecx mov ecx,edi @@ -1106,10 +1086,10 @@ NNP_SetMemData: add eax,edx stdcall Layer_Create,eax cmp ebx,[ebp-4] ;if(n>s || k>s) - jb .215 + jb @f cmp ebx,[ebp-8] - jae .214 -.215: + jae .1 +@@: mov edx,[ebp+8] mov ecx,[edx+NeuralNetwork.errors] cmp ecx,[edx+NeuralNetwork.errorsNext] @@ -1135,45 +1115,45 @@ NNP_SetMemData: stdcall [mem.realloc], [edx+NeuralNetwork.deltas],ebx mov edx,[ebp+8] mov dword[edx+NeuralNetwork.deltas],eax -.214: +.1: stdcall @@strstr$qpxct1, esi,txt_biases add esp,8 mov esi,eax test esi,esi - jne .216 + jne @f mov eax,11 - jmp .193 -.216: + jmp .end_f +@@: stdcall @@strchr$qpxci, esi,'[' add esp,8 mov ebx,eax test ebx,ebx - jne .217 + jne @f mov eax,txt_err_sqbrl_b1 - jmp .193 -.217: + jmp .end_f +@@: inc ebx xor edx,edx mov dword[ebp-8],edx - jmp .219 -.218: + jmp .4 +.2: dec edx cmp eax,edx - jae .220 + jae @f stdcall @@strchr$qpxci, ebx,',' add esp,8 mov esi,eax - jmp .221 -.220: + jmp .3 +@@: stdcall @@strchr$qpxci, ebx,']' add esp,8 mov esi,eax -.221: +.3: test esi,esi - jne .222 + jne @f mov eax,13 - jmp .193 -.222: + jmp .end_f +@@: mov byte[esi],0 stdcall @@StrToDouble$qpc,ebx pop ecx @@ -1186,7 +1166,7 @@ NNP_SetMemData: mov edx,[eax+edx+Layer.biases] fstp qword[edx+8*ecx] inc dword[ebp-8] -.219: +.4: mov edx,edi imul edx,sizeof.Layer mov ecx,[ebp+8] @@ -1194,29 +1174,29 @@ NNP_SetMemData: mov edx,[edx+Layer.c_size] mov eax,[ebp-8] cmp edx,eax - ja .218 + ja .2 mov esi,ebx stdcall @@strstr$qpxct1, esi,txt_weights add esp,8 mov esi,eax test esi,esi - jne .224 + jne @f mov eax,14 - jmp .193 -.224: + jmp .end_f +@@: stdcall @@strchr$qpxci, esi,'[' add esp,8 mov esi,eax test esi,esi - jne .225 + jne @f mov eax,txt_err_sqbrl_w1 - jmp .193 -.225: + jmp .end_f +@@: inc esi xor edx,edx mov dword[ebp-8],edx ;k=0 - jmp .227 -.226: ;for(k=0;klayers[i].c_size;k++) + jmp .7 +.cycle_1: ;for(k=0;klayers[i].c_size;k++) mov eax,edi imul eax,sizeof.Layer @@ -1226,39 +1206,39 @@ NNP_SetMemData: or eax,eax jnz .end_null_we inc dword[ebp-8] ;k++ - jmp .227 ;if 'weights' is null array + jmp .7 ;if 'weights' is null array .end_null_we: stdcall @@strchr$qpxci, esi,'[' add esp,8 mov ebx,eax test ebx,ebx - jne .228 + jne @f mov eax,txt_err_sqbrl_w2 - jmp .193 -.228: + jmp .end_f +@@: inc ebx xor edx,edx mov dword[ebp-12],edx ;j=0 - jmp .230 -.229: ;for(j=0;jlayers[i].n_size;j++) + jmp .6 +.cycle_2: ;for(j=0;jlayers[i].n_size;j++) dec edx cmp eax,edx ;eax = j, edx = n_size-1 - jae .231 + jae @f stdcall @@strchr$qpxci, ebx,',' add esp,8 mov esi,eax - jmp .232 -.231: + jmp .5 +@@: stdcall @@strchr$qpxci, ebx,']' add esp,8 mov esi,eax -.232: +.5: test esi,esi - jne .233 + jne @f mov eax,txt_err_sqbrr_w2 - jmp .193 -.233: + jmp .end_f +@@: mov byte[esi],0 stdcall @@StrToDouble$qpc,ebx pop ecx @@ -1273,7 +1253,7 @@ NNP_SetMemData: mov edx,[ebp-12] fstp qword[eax+8*edx] inc dword[ebp-12] -.230: +.6: mov edx,edi imul edx,sizeof.Layer mov ecx,[ebp+8] @@ -1281,27 +1261,27 @@ NNP_SetMemData: mov edx,[edx+Layer.n_size] mov eax,[ebp-12] cmp edx,eax - ja .229 + ja .cycle_2 mov esi,ebx inc dword[ebp-8] -.227: +.7: mov eax,edi imul eax,sizeof.Layer mov edx,[ebp+8] add eax,[edx+NeuralNetwork.layers] mov eax,[eax+Layer.c_size] cmp eax,[ebp-8] - ja .226 + ja .cycle_1 inc edi -.205: +.8: mov edx,[ebp+8] cmp edi,[edx+NeuralNetwork.layers_length] - jb .204 + jb .cycle_0 xor eax,eax - jmp .193 -.198: + jmp .end_f +.9: mov eax,1000 -.193: +.end_f: pop edi esi ebx mov esp,ebp pop ebp @@ -1320,20 +1300,19 @@ Layer_Destroy: call @$bdele$qpv pop ecx xor ebx,ebx - jmp .143 -.142: + jmp @f +.cycle_1: mov eax,[esi+Layer.weights] push dword[eax+4*ebx] call @$bdele$qpv pop ecx inc ebx -.143: +@@: cmp ebx,[esi+Layer.c_size] - jb .142 + jb .cycle_1 push dword[esi+Layer.weights] call @$bdele$qpv pop ecx -.145: pop esi ebx ebp ret 4 @@ -1344,17 +1323,17 @@ NNP_Destroy: push ebx esi mov esi,[ebp+8] xor ebx,ebx - jmp .232 -.231: + jmp @f +.cycle_1: mov eax,ebx imul eax,sizeof.Layer add eax,[esi+NeuralNetwork.layers] push eax call Layer_Destroy inc ebx -.232: +@@: cmp ebx,[esi+NeuralNetwork.layers_length] - jb .231 + jb .cycle_1 push dword[esi+NeuralNetwork.layers] call @$bdele$qpv pop ecx @@ -1398,14 +1377,3 @@ EXPORTS: sz_getmemdata db 'NNP_GetMemData',0 sz_setmemdata db 'NNP_SetMemData',0 sz_destroy db 'NNP_Destroy',0 - -align 16 -@IMPORT: - -library \ - libc, 'libc.obj' - -import libc, \ -_strcat, 'strcat',\ -_exp, 'exp' -;_scanf, 'scanf',\ ;???