assembly gdb 64bit

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.