LJMP sintaxe na linha de montagem gcc
-
18-09-2019 - |
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"
);
}
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.