Pregunta

Yo estaba pensando en usar un salto lejos para establecer el segmento de código (CS) se registra. Entrar en por qué estoy haciendo esto y por qué estoy tratando con la segmentación del todo tomaría un tiempo, así que tengan paciencia conmigo y consideramos que es un ejercicio académico. Me parece que no puede obtener el derecho de sintaxis.

Error: suffix or operands invalid for 'ljmp'

Sé que es tonto como para poner cs en otro registro, pero pensé que me gustaría probarlo ya que el uso %0 no estaba funcionando (el registro ax no funciona bien).

Estoy buscando en algún código que compila bien y esto me está volviendo loco, ya que pensé ljmp sería la misma: __asm volatile ( "lcall $0x8, $far_call" );

lo haría, por supuesto, la bienvenida a otras formas de hacky afectar el registro CS.

void set_cs(u16 cs) {
    __asm__ volatile (
        "mov %0, %%ax \n\t"
        "ljmp %%ax, $fake_label \n\t"
        "fake_label: \n\t"
        :
        : "r" (cs)
        : "ax"
    );
}
¿Fue útil?

Solución

Al parecer LJMP exige constantes al trabajo, mientras que este genera más de código y obviamente no es particularmente seguro, esta parece funcionar como cuando entro en un valor que no es el valor actual CS, la aplicación se bloquea. Utiliza un valor inmediato en su lugar:

#define set_cs( cs ) asm volatile ( "ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs) )

No es tan elegante como supongo que quería que fuera, y depende totalmente de lo que estamos tratando de hacer. No me puedo imaginar esto alguna vez ser útil o incluso trabajando si estás compilando esto para ejecutar bajo Linux / Windows.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top