diff --git a/05-subroutines-params/task1.c b/05-subroutines-params/task1.c new file mode 100644 index 0000000..9579b78 --- /dev/null +++ b/05-subroutines-params/task1.c @@ -0,0 +1,55 @@ +#include + +typedef struct +{ + unsigned long h; + unsigned long l; +} LongNum; + +typedef unsigned char byte; + +extern void task_regs(LongNum* a, LongNum* b, LongNum* result); + +extern unsigned long task_stack(); // Для передачи через Си потребуется функцкия-обертка + +unsigned long stack_wrapper(void* arr, byte bits) +{ + unsigned long result = 0; + byte shift = bits >> 3; + printf("shift is %d", shift); + __asm__( + "pushq %%rsp\n\t" + "movq $2, %%rcx\n\t" + "subq $2, %%rsp\n\t" + "movb %2, (%%rsp)\n\t" + "xorq %%rdx, %%rdx\n\t" + "pop %%dx\n\t" + "stack_push_loop:\n\t" + "subq %%rdx, %%rsp\n\t" + "movq (%1), %%rsp\n\t" + "addq %%rdx, %1\n\t" + "loopq stack_push_loop\n\t" + "call stack_wrapper\n\t" + "addq %%rdx, %%rdx\n\t" // умножаем на 2 + "addq %%rdx, %%rsp\n\t" + "popq %%rsp" + :"=a"(result) + :"b"(arr), "d"(shift) + :"%rcx" + ); + result = task_stack(); + return result; +} + +int main() +{ + LongNum a = { 0x00000000, 0x01000000}; // По факту передача через стек) + LongNum b = { 0x10100010, 0x0900000f}; + LongNum c; + + task_regs(&a, &b, &c); + printf("asdfasfasfasfda %lx %lx", c.h, c.l); // Проверим, что сложили +- корректно + int nums[2] = {88, 11}; + stack_wrapper(nums, sizeof(int)); + return 0; +}