В качестве обходного пути с инструкциями x86 я использовал код операции, похожий на .byte 0xf1, 0xc1
, и попытался выполнить его внутри GDB.дизассемблирование этой строки показывает
f1 icebp
Таким образом, когда выбирается первый байт, который является F1, он распознается как инструкция с именем icebp
.Известно, что это недокументированная инструкция.Единственное, что я нашел в SDM, это сноска в разделах INT, в которой сказано:
The mnemonic ICEBP has also been used for the instruction with opcode F1
В продолжение gdb написано:
Cannot access memory at address 0x1ffffc20
Итак, что это за адрес?Как это генерируется?Это физический или виртуальный?и как я могу проверить его реальную функциональность?
ОБНОВЛЕНИЕ:
Операции GDB показаны ниже:
(gdb) list
1 void main()
2 {
3 __asm__(".byte 0xf1, 0xc1");
4 }
(gdb) set disassembly-flavor intel
(gdb) disass /r main
Dump of assembler code for function main:
0x00000000004004ed <+0>: 55 push rbp
0x00000000004004ee <+1>: 48 89 e5 mov rbp,rsp
0x00000000004004f1 <+4>: f1 icebp
0x00000000004004f2 <+5>: c1 5d c3 66 rcr DWORD PTR [rbp-0x3d],0x66
End of assembler dump.
(gdb) b main
Breakpoint 1 at 0x4004f3: file machine2.c, line 4.
(gdb) run
Starting program: /home/mahmood/Documents/./machine2
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000004004f2 in main () at machine2.c:2
2 {
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64
(gdb) x/i $pc
=> 0x4004f2 <main+5>: rcr DWORD PTR [rbp-0x3d],0x66
(gdb) n
Cannot access memory at address 0x1ffffc20
(gdb) x/i $pc
=> 0x4004f5: nop WORD PTR cs:[rax+rax*1+0x0]
UDPATE2:
После удаления c1
, отладчик не может установить точку останова в строке asm.
(gdb) list
1 void main()
2 {
3 __asm__(".byte 0xf1");
4 }
(gdb) b machine2.c:3
Breakpoint 1 at 0x4004f2: file machine2.c, line 3.
(gdb) run
Starting program: /home/mahmood/Documents/./machine2
Breakpoint 1, main () at machine2.c:4
4 }
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64