assembly - gdb-nop con datos adicionales, ¿por qué?
64bit (1)
Actualmente estoy escribiendo pruebas simples para comprender cómo compila gdb de C ++ a asm utilizando extern "C"
y la opción -O0
y mi objeto asm se compila con nasm -g -f elf64
Aquí está mi marco de pila preocupado desmontado:
0x0000000000400570 <+0>: push rbp
0x0000000000400571 <+1>: mov rbp,rsp
0x0000000000400574 <+4>: push r10
=> 0x0000000000400576 <+6>: mov r10,QWORD PTR [rbp-0x8]
0x000000000040057a <+10>: pop r10
0x000000000040057c <+12>: mov rsp,rbp
0x000000000040057f <+15>: pop rbp
0x0000000000400580 <+16>: ret
0x0000000000400581 <+17>: nop WORD PTR cs:[rax+rax*1+0x0] ; this instruction
0x000000000040058b <+27>: nop DWORD PTR [rax+rax*1+0x0] ; and this one
Las dos últimas instrucciones están rellenas con nop
, puedo obtener esto debido a la alineación.
Ahora mi pregunta es por qué nop
están siendo WORD PTR cs:[rax+rax*1+0x0]
y DWORD PTR [rax+rax*1+0x0]
?
Esas son instrucciones multi-byte nop, usadas como relleno para fines de alineación. En este caso, nunca se ejecutarán, por lo que el compilador podría haber utilizado cualquier cosa, pero en otras circunstancias puede ser necesario que sea ejecutable. Consulte también el manual de optimización de Intel, sección 3.5.1.9 Uso de NOP , así como la entrada de referencia del conjunto de instrucciones para NOP
, por supuesto.