Pergunta

Eu estava pensando em usar um salto muito para definir o segmento de código (CS) registrar. Metendo por isso que eu estou fazendo isso e por isso que eu estou lidando com segmentação em tudo iria demorar um pouco, para ter comigo e considerá-lo um exercício acadêmico. Eu não consigo obter o direito de sintaxe.

Error: suffix or operands invalid for 'ljmp'

Eu sei que é tolo para colocar cs em outro registro, mas eu percebi que eu experimentá-lo uma vez usando %0 não estava funcionando (o registro ax não quer trabalhar).

Eu estou olhando para algum código que compila bem e isso está me deixando louco, desde que eu pensei ljmp seria o mesmo: __asm volatile ( "lcall $0x8, $far_call" );

Gostaria de boas-vindas naturalmente, outras maneiras hacky de afetar o registo 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"
    );
}
Foi útil?

Solução

Parece LJMP requer constantes ao trabalho, enquanto isso gera mais código e obviamente não é particularmente seguro, este parece funcionar como quando eu inserir um valor que não é o valor atual cs, o aplicativo falha. Ele usa um valor imediato em vez disso:

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

Não é tão elegante como eu suponho que você queria que fosse, e depende inteiramente do que você está tentando fazer. Eu não posso imaginar que este nunca ser útil ou mesmo trabalhar se você está compilando esta a correr em Linux / Windows.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top