Я хочу изолировать пользовательский код операции в моей программе, чтобы перехватить недопустимое исключение кода операции, если оно есть.Если я пишу пустой основной файл, я вижу последовательность сборки, как показано ниже:
(gdb) list
1 void main()
2 {
3 }
(gdb) disass /r main
Dump of assembler code for function main:
0x00000000004004ed <+0>: 55 push %rbp
0x00000000004004ee <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004f1 <+4>: 5d pop %rbp
0x00000000004004f2 <+5>: c3 retq
End of assembler dump.
Если я записываю один случайный байт, например __asm__(".byte 0x01");
, я вижу, что он автоматически добавляет к этому 5d и c3, поскольку он предполагаеткод операции ADD, поэтому ему нужно более одного байта.
0x00000000004004f1 <+4>: 01 5d c3 add %ebx,-0x3d(%rbp)
Конец дампа ассемблера.
Если я добавлю NOP (0x90) до и после этого, он не будеттакже поможет, и он автоматически добавит 0x90 к 0x01.
0x00000000004004f1 <+4>: 90 nop
0x00000000004004f2 <+5>: 90 nop
0x00000000004004f3 <+6>: 90 nop
0x00000000004004f4 <+7>: 01 90 90 90 90 90 add %edx,-0x6f6f6f70(%rax)
0x00000000004004fa <+13>: 90 nop
0x00000000004004fb <+14>: 5d pop %rbp
0x00000000004004fc <+15>: c3 retq
При выполнении этого ADD я получаю ошибку ошибки сегментации.Поэтому я не могу различить ошибку сегмента и неверную инструкцию / код операции.Я хочу изолировать этот код операции.Как насчет выравнивания на разных страницах и обработки ошибок страниц?
Любой комментарий?