Pergunta

Lembro-me de que antigamente, com o antigo compilador DOS da Borland, você poderia fazer algo assim:

asm {
 mov ax,ex
 etc etc...
}

Existe uma maneira independente de semiplataforma de fazer isso agora?Preciso fazer uma chamada de BIOS, então se houvesse uma maneira de fazer isso sem código ASM, isso seria igualmente útil para mim.

Foi útil?

Solução

Usando CCG

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

Usando VC++

__asm {
  mov eax, edx
  add eax, 2
}

Outras dicas

No GCC, há mais do que isso.Na instrução, você deve informar ao compilador o que mudou, para que seu otimizador não estrague.Não sou especialista, mas às vezes é algo assim:

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

É uma boa ideia escrever algum código de exemplo em C, depois pedir ao GCC para produzir uma listagem de assembly e, em seguida, modificar esse código.

Um bom começo seria ler este artigo que fala sobre montagem inline em C/C++:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

Exemplo do artigo:

#include <stdio.h>


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

Compiladores Microsoft não x86 não suportam montagem em linha.Você deve definir toda a função em um arquivo fonte de montagem separado e passá-lo para um montador.

É altamente improvável que você consiga acessar o BIOS em um sistema operacional em modo protegido e deva usar todos os recursos disponíveis nesse sistema.Mesmo se você estiver no modo kernel, provavelmente não é seguro - o BIOS pode não estar sincronizado corretamente em relação ao estado do sistema operacional se você fizer isso.

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