cs
es el segmento del código. cs:ip
, que significa cs
junto con ip
(puntero de instrucción) apunta a la ubicación de la siguiente instrucción. Por lo tanto, cualquier cambio a cs
o ip
o ambos cambia la dirección desde donde se buscará y ejecutará la siguiente instrucción.
se le cambie cs
con un (salto de longitud) jmp
, call
(llamada de larga duración), retf
, int3
, int
o iret
. En 8088 y 8086 pop cs
también está disponible (código de operación 0x0F). pop cs
no funcionará en 186+, en el que el código de operación 0x0F está reservado para instrucciones multibyte. http://en.wikipedia.org/wiki/X86_instruction_listings
No hay nada intrínsecamente peligroso en el salto largo o la llamada larga. Solo tienes que saber dónde saltas o llamas y, en modo protegido, debes tener suficientes privilegios para hacerlo. En el modo real de 16 bits (por ejemplo, DOS) puede saltar y llamar a la dirección que desee, por ejemplo. jmp 0xF000:0xFFF0
establece cs
a 0xF000
y ip
a 0xFFF0
, que es la dirección de inicio del código de BIOS, y por lo tanto reinicia la computadora. Diferentes direcciones de memoria tienen diferentes códigos y causan diferentes tipos de resultados, en teoría todo puede suceder (si ingresas al código del BIOS utilizado para formatear el disco duro, con valores válidos de registro y/o pila, entonces el disco duro se formateará 'de acuerdo a lo pedido'). En la práctica, jmp
y call
a la mayoría de las direcciones probablemente resulten en código de operación no válido o alguna otra excepción (división por cero, desbordamiento de división, etc.) muy pronto.
'CS' = segmento de código. Supongo que cambiarlo es equivalente (en cierto sentido) a un 'jmp' pervertido. – valdo
Ese documento parece bastante poco fiable: "¡NO CAMBIE NUNCA' CS' !!, pero puede leer 'CS' como:' mov ds, cs'; poner el valor de 'CS' en' D'S. " Bueno, en x86 no hay instrucciones tales como 'mov ds, cs' ni ningún otro' mov segreg, segreg'. Para leer el valor de 'cs' puedes usar' mov reg, cs; mov ds, reg' (donde 'reg' puede ser' ax', 'bx',' cx' etc ...), o 'push cs; pop ds'. Además, si decide no * ever * cambiar 'cs', todas las llamadas de interrupción están fuera de cuestión (por ejemplo, servicios de BIOS, DOS y Linux). http://web.itu.edu.tr/kesgin/mul06/intel/instr/mov.html – nrz
@nrz: No hay tal cosa como "servicios de Linux" accesibles a través de llamadas 'lejos' (las interrupciones/llamadas de sistema funcionan de manera diferente, aunque esto conlleve un cambio en' cs ', el _caller_ no puede controlar el destino de' cs', eso lo decide el SO al configurar las entradas IDT/syscall msrs). Ack con todo lo demás, obviamente 'cs' _ puede_ cambiarse, solo que a menos que el segmento de código de destino exista y esté configurado de tal manera que el' eip' objetivo sea alcanzable, cualquier llamada de ese tipo causará una falla '# GP' y la aplicación abortará –