diff --git a/main.asm b/main.asm index 144d30b..a5bfe1f 100644 --- a/main.asm +++ b/main.asm @@ -15,6 +15,12 @@ fd_str: db "file descriptor", 0 close_str: db "close", 0 content_str: db "Content: '%s'", 10, 0 nbr_str: db "number", 0 +ecx_str: db "ecx", 0 +pecx_str: db "pecx", 0 +a_str: db "a", 0 +b_str: db "b", 0 +d_str: db "d", 0 + exitcode: dw 0 @@ -95,6 +101,74 @@ readval: ;; end of readval1 +popmin: + push rbp + mov rbp, rsp + sub rsp, 22H + + ;; 8H, 0 -> min value address + ;; 12H, 8H -> min value + ;; 14H, 12H -> loop counter + ;; 22H, 14H : current address + + ;; rdi: list effective address + mov qword [rbp-8H], rdi + mov qword [rbp-22H], rdi ; current address + + mov esi, [rdi] + mov dword [rbp-12H], esi + + mov ecx, 1000 + minloop: + mov word [rbp-14H], cx + + ;; lea rdi, [pecx_str] + ;; mov esi, ecx + ;; call printvalue + + mov r9, qword [rbp-22H] + mov edi, [r9] ; current value + mov esi, dword [rbp-12H] ; min value + + cmp esi, 0 + je updatemin + + cmp edi, 0 + je next ; skip zeroes + + cmp edi, esi + jle updatemin + jmp next + +updatemin: + mov r9, qword [rbp-22H] + mov dword [rbp-12H], edi + mov qword [rbp-8H], r9 + +next: + mov r9, qword [rbp-22H] + add r9, 4H + mov qword [rbp-22H], r9 + + mov cx, [rbp-14H] + cmp cx, 2 + jne d + + jmp d + +d: + dec cx + jnz minloop + + mov rax, qword [rbp-8H] + mov dword [rax], 0H + mov eax, dword [rbp-12H] + + mov rsp, rbp + pop rbp + ret + + _start: push rbp mov rbp, rsp @@ -129,7 +203,7 @@ _start: mov word [rbp-14H], 0H ; line number mov cx, [nb_lines] ; number of lines -loop: +loop0: mov [rbp-19H], cx ; store loop counter ;; read the 1st value @@ -143,7 +217,7 @@ loop: ;; calculate list position xor rax, rax mov ax, word [rbp-14H] - mov bx, 2H + mov bx, 4H mul bx ;; 14H -> 12H : line counter mov rbx, 2000H @@ -184,15 +258,17 @@ loop: mov cx, [rbp-19H] ; restore loop counter dec cx - jnz loop + jnz loop0 - ;; print values + ;; PRINT VALUES mov word [rbp-14H], 0 ; line number xor ecx, ecx mov ecx, 2024 ; There are 24 dword between address 1060H and 1000H - .loop: + jmp skip + + .loop1: mov [rbp-19H], cx ; store loop counter ;; calculate list 1 position @@ -213,7 +289,76 @@ loop: inc word [rbp-14H] mov cx, [rbp-19H] - loop .loop + loop .loop1 + +skip: + + mov ecx, 1000 +sumloop: + mov word [rbp-19H], cx + + ;; 50H - 46H : min1 + ;; 46H - 42H : min2 + ;; 42H - 34H : sum + + ;; lea rdi, [ecxnext_str] + ;; mov esi, ecx + ;; call printvalue + + lea rdi, [rbp-2000H] + call popmin + mov dword [rbp-50H], eax + + ;; lea rdi, [a_str] + ;; mov esi, eax + ;; call printvalue + + lea rdi, [rbp-1000H] + call popmin + mov dword [rbp-46H], eax + + ;; lea rdi, [b_str] + ;; mov esi, eax + ;; call printvalue + + xor rax, rax + mov eax, dword [rbp-50H] + mov ebx, dword [rbp-46H] + + cmp eax, ebx + jge a + jmp b + +a: + sub eax, ebx + jmp sum + +b: + sub ebx, eax + mov eax, ebx + jmp sum + +sum: + mov rbx, qword [rbp-42H] + add rbx, rax + mov qword [rbp-42H], rbx + + ;; lea rdi, [d_str] + ;; mov rsi, rax + ;; call printvalue + + mov cx, word [rbp-19H] + dec cx + cmp cx, 0 + jnz sumloop + + mov rax, qword [rbp-42H] + + ;; print sys_close result + lea rdi, [nbr_str] + mov rsi, rax + call printvalue + close_file: