Как переместить пролог в функцию c ++? - PullRequest
0 голосов
/ 29 апреля 2018

Командная строка

g ++ -g -Og -m64 -c -mabi = ms -mno-red-zone -mno-mmx -mno-sse -nostartfiles -nostdlib -nostdinc -nostdinc ++ -undef -finline-functions -falign-functions = 16 -falign-tags = 1 -falign-loops = 1 -falign-jumps = 1 -fno-встроенный -признаки -fno-use-cxa-atexit -fpermissive -fno-rtti -fno-исключения -fno-stack-protector -fshort -wchar -free -fno-toplevel-reorder -fsigned-char -funsigned-bitfields

Источник

#define INT_PROLOG \
  asm volatile ("push %rsp\n\
  push %rax\n\
  ... save registers
  push %r15\n\
  ");

#define INT_EPILOG \
  asm volatile ("pop %r15\n\
  pop %r14\n\
  ... restore registers
  pop %rax\n\
  pop %rsp\n\
  ");

#define ERRINT_BEGIN(name, err) VOID DALIGNED name(size_t err) {\
  asm volatile ("pop %rcx");\
  INT_PROLOG;

#define INT_BEGIN(name) VOID DALIGNED name (size_t) {\
  INT_PROLOG

#define INT_END \
  asm volatile ("\n\
    movq    huEOI(%rip), %rax\n\
    movl    $0, (%rax)");\
  INT_EPILOG;\
  asm volatile ("iretq");\
  }

INT_BEGIN(int_de)
  uart_send("DE\n");
  hung();
INT_END

произвести следующий код

INT_BEGIN(int_de)
  40:   48 83 ec 28             sub    $0x28,%rsp
  44:   54                      push   %rsp
  45:   50                      push   %rax
  ...
  5a:   41 57                   push   %r15

Что я хочу:

INT_BEGIN(int_de)
  40:   54                      push   %rsp
  41:   50                      push   %rax
  ...
  52:   41 57                   push   %r15
  54:   48 83 ec 28             sub    $0x28,%rsp

1 Ответ

0 голосов
/ 09 мая 2018

Необходим атрибут ((прерывание)) Это не работает для 'Bash на Ubuntu в Windows'!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...