From fa92aeebd478ee9bed5117ec9aab620c01c8cf7a Mon Sep 17 00:00:00 2001 From: root Date: Thu, 3 Oct 2024 17:59:57 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B1=D0=BE=D0=BB=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05-subroutines-params/task1.c | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 05-subroutines-params/task1.c 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; +}