Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "io.inc"
- CEXTERN malloc
- CEXTERN printf
- CEXTERN scanf
- CEXTERN free
- section .rodata
- io_ db `%d `, 0
- io db `%d`, 0
- ion db `\n`, 0
- lo db `%lld\n`, 0
- section .data
- answer_matrix dd 0
- answer_size dd 0
- answer_trace dq 0
- n dd 0
- current_matrix dd 0
- current_size dd 0
- current_trace dq 0
- temp dd 0
- section .text
- global CMAIN
- CMAIN:
- mov ebp, esp
- and esp, 0xfffffff0
- ;PRINT_DEC 4, esp
- ;PRINT_DEC 4, [answer_trace]
- ;PRINT_DEC 4, [answer_trace + 4]
- ;NEWLINE
- sub esp, 8
- push n ; второй аргумент
- push io ; первый аргумент
- call scanf ; Ввод количества матриц
- add esp, 16
- sub esp, 8
- push answer_size ; второй аргумент
- push io ; первый аргумент
- call scanf ; ввод размера первой матрицы
- add esp, 16
- mov edx, [answer_size] ; выделение памяим для answer_matrix
- imul edx, edx
- imul edx, 4
- sub esp, 12
- push edx
- call malloc
- add esp, 16
- mov [answer_matrix], eax
- mov [current_matrix], eax
- mov ebx, 0
- .for_i_first:
- cmp ebx, [answer_size]
- jz .stop_for_i_first
- mov ecx, 0
- .for_j_first:
- cmp ecx, [answer_size]
- jz .stop_for_j_first
- sub esp, 12
- push ecx
- mov edx, [answer_size]
- imul edx, ebx
- add edx, ecx
- shl edx, 2
- ;PRINT_STRING `Смещение: `
- ;PRINT_DEC 4, edx
- ;NEWLINE
- mov esi, answer_matrix
- mov esi, [esi]
- add esi, edx
- sub esp, 8
- push esi ; второй аргумент
- push io ; первый аргумент
- call scanf
- add esp, 16
- mov eax, [esi]
- ;PRINT_DEC 4, eax
- ;NEWLINE
- pop ecx
- add esp, 12
- cmp ebx, ecx
- jnz .not_equal_first
- push ecx
- mov ecx, eax
- sar ecx, 31
- mov edi, [answer_trace]
- mov esi, [answer_trace + 4]
- add edi, eax
- adc esi, ecx
- mov [answer_trace], edi
- mov [answer_trace + 4], esi
- pop ecx
- .not_equal_first:
- inc ecx
- jmp .for_j_first
- .stop_for_j_first:
- inc ebx
- jmp .for_i_first
- .stop_for_i_first:
- ;push dword [answer_trace + 4]
- ; push dword [answer_trace] ; второй аргумент
- ; push lo ; первый аргумент
- ; call printf
- ; add esp, 12
- mov esi, 1
- .for:
- cmp esi, [n]
- jz .stop_for
- ;lea eax, [current_matrix] ; lea
- ; sub esp, 12
- ; push eax
- ; call free
- ; add esp, 16
- mov dword [current_trace], 0
- mov dword [current_trace + 4], 0
- sub esp, 8
- push current_size ; второй аргумент
- push io ; первый аргумент
- call scanf
- add esp, 16
- mov edi, [current_size]
- mov edx, 0
- imul edi, edi
- imul edi, 4
- sub esp, 12
- push edi
- call malloc
- add esp, 16
- mov [current_matrix], eax
- mov ebx, 0
- .for_i:
- cmp ebx, [current_size]
- jz .stop_for_i
- mov ecx, 0
- .for_j:
- cmp ecx, [current_size]
- jz .stop_for_j
- push esi
- push ecx
- mov edx, [current_size]
- imul edx, ebx
- add edx, ecx
- shl edx, 2
- ;PRINT_STRING `Смещение: `
- ;PRINT_DEC 4, edx
- ;NEWLINE
- mov esi, current_matrix
- mov esi, [esi]
- add esi, edx
- push esi ; второй аргумент
- push io ; первый аргумент
- call scanf
- add esp, 8
- mov eax, [esi]
- ;PRINT_DEC 4, eax
- ;NEWLINE
- pop ecx
- cmp ebx, ecx
- jnz .not_equal
- push ecx
- mov ecx, eax
- sar ecx, 31
- mov edi, [current_trace]
- mov esi, [current_trace + 4]
- add edi, eax
- adc esi, ecx
- mov [current_trace], edi
- mov [current_trace + 4], esi
- pop ecx
- .not_equal:
- pop esi
- inc ecx
- jmp .for_j
- .stop_for_j:
- inc ebx
- jmp .for_i
- .stop_for_i:
- ;PRINT_STRING `CURRENT_TRACE = `
- ;PRINT_DEC 4, [current_trace]
- ;NEWLINE
- ;PRINT_STRING `ANSWER_TRACE = `
- ;PRINT_DEC 4, [answer_trace]
- ;NEWLINE
- mov ecx, [current_trace + 4] ; старшие (левые) разряды
- cmp ecx, [answer_trace + 4] ; старшие (левые) разряды равны?
- jg .replace ; если старшие разряды current_trace больше, чем старшие разряды answer_trace => заменить
- cmp ecx, [answer_trace + 4] ; если равны => проверить младшие
- jz .check_little
- jmp .end_of_replacement
- .check_little:
- ;PRINT_UDEC 4, [current_trace]
- ;NEWLINE
- ;PRINT_UDEC 4, [answer_trace]
- ;NEWLINE
- mov ecx, [current_trace]
- cmp ecx, [answer_trace]
- ja .replace
- jmp .end_of_replacement
- .replace:
- ;PRINT_STRING `current_ESI = `
- ;PRINT_DEC 4, esi
- ;NEWLINE
- mov ecx, [current_trace]
- mov [answer_trace], ecx
- mov ecx, [current_trace + 4]
- mov [answer_trace + 4], ecx
- mov ecx, [current_matrix] ; lea
- mov [answer_matrix], ecx
- mov ecx, [current_size]
- mov [answer_size], ecx
- .end_of_replacement:
- inc esi
- jmp .for
- .stop_for:
- ;push dword [answer_trace + 4]
- ; push dword [answer_trace] ; второй аргумент
- ; push lo ; первый аргумент
- ; call printf
- ; add esp, 12
- mov edi, [n]
- mov esi, 1
- mov ebx, 0
- .print_for:
- cmp ebx, [answer_size]
- jz .stop_print_for
- mov ecx, 0
- .inner_print_for:
- cmp ecx, [answer_size]
- jz .stop_inner_print_for
- mov edx, [answer_size]
- imul edx, ebx
- add edx, ecx
- shl edx, 2
- ;PRINT_STRING `Смещение: `
- ;PRINT_DEC 4, edx
- ;NEWLINE
- mov esi, answer_matrix
- mov esi, [esi]
- add esi, edx
- push ecx
- sub esp, 4
- push dword [esi] ; второй аргумент
- push io_ ; первый аргумент
- call printf
- add esp, 12
- pop ecx
- inc ecx
- jmp .inner_print_for
- .stop_inner_print_for:
- sub esp, 12
- push ion ; первый аргумент
- call printf
- add esp, 16
- inc ebx
- jmp .print_for
- .stop_print_for:
- ;lea eax, [answer_matrix] ; lea
- ; and esp, 0xfffffff0
- ; sub esp, 12
- ; push eax
- ; call free
- ; add esp, 16
- mov esp, ebp
- xor eax, eax
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement