#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; }