Files
solutions/05-subroutines-params/task.asm

112 lines
2.9 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

global task_regs
global task_stack
global task_stack_wrapper
section .note.GNU-stack
section .text
task_regs: ; rdi - указатель первое на число, rsi - указатель второе на число, rdx - результат
push rax
mov rax, [rdi]
mov [rdx], rax
mov rax, [rdi + 8]
mov [rdx + 8], rax
mov rax, [rsi + 8]
add [rdx + 8], rax
mov rax, [rsi]
adc [rdx], rax
pop rax
ret
task_stack_wrapper: ;rdi - указатель, rsi - сколько
push rbp
mov rbp, rsp
push rdi
push rsi
shr rsi, 3 ; делим на 8 в ускоренном порядке. (приводим к байтам)
; вычитаем 2 раза так как поверьте, циклы городить намного труднее
sub rsp, rsi
sub rsp, rsi
sub rsp, rsi
sub rsp, rsi
; сыграем в чихарду
mov rcx, rsi
shl rcx, 2 ; сносим 2 числа, поэтому байтов в 2 раза больше + по 2 числа на число
mov rsi, rdi
mov rdi, rsp
rep movsb
; закинем байт разрядности
;push si
;shl word [rsp], 8
dec rsp
mov al, [rbp - 16]
mov [rsp], al
;add rsp, 1
; вызов
call task_stack
; восстанавливаемся
add rsp, 1 ; pачищаем разрядность
; Циклы, как я уже и говорил, я делать отказываюсь
mov rcx, [rbp - 16]
shr rcx, 1 ; делим на 8 умножаем на 4, того множим на 2
add rsp, rcx ; затираем бедный стек
pop rsi
pop rdi
pop rbp
ret
task_stack: ; разрядность - 1 байт. Дальше читаем сколько надо. Читает в 2 раза больше разрядности
push rbp
mov rbp, rsp
mov al, [rbp + 16]
test al, 64
jnz .64bit
test al, 32
jnz .32bit
test al, 16
jnz .16bit
test al, 8
.8bit:
xor rax, rax
mov al, [rbp + 17]
mov ah, [rbp + 18]
mov cl, [rbp + 19]
mov ch, [rbp + 20]
add al, cl
adc ah, ch
jmp .end
.16bit:
xor rax, rax
mov ax, [rbp + 23] ; старшая
mov dx, [rbp + 21] ; младшая
mov cx, [rbp + 17] ; младшая
mov bx, [rbp + 19] ; старшая
;add cx, bx
;adc ax, dx
add dx, cx
adc ax, bx
pushfq ; Сохраним флаги на всякий
sal eax, 16
mov ax, dx
popfq
jmp .end
.32bit:
xor rax, rax
; Не выровнянные данные - vae soli, но тут уже оставлю talis qualis, мне влом
mov eax, [rbp + 21] ; старшая часть 1-го
mov edx, [rbp + 29] ; старшая часть 2-го
mov ecx, [rbp + 17] ; младшая
mov ebx, [rbp + 25] ;младшая
add ecx, ebx
adc eax, edx
pushfq ; Сохраним флаги на всякий
sal rax, 32
mov eax, ecx
popfq
jmp .end
.64bit:
;crush
.end:
pop rbp
ret