Assembly label inline

1. Assembly label inline

???
gokernel

(usa Linux Mint)

Enviado em 15/07/2012 - 12:24h


Ola pessoal !!!.

Nao encontrei a parte de ASSEMBLY entao vai aqui mesmo ... estou com pressa/fome ;)

pergunta:

Alguem sabe em ASSEMBLY INLINE como fazer um ( label + quebra_linha );

queria fazer isso, so que em assembly inline:
---------------------------------------------
LC11:
.ascii "%d\12{TTEXTO}"
---------------------------------------------

para depois fazer assim:

asm ("movl %ebx, %eax");
asm ("movl %eax, 4(%esp)"); // valor
asm ("movl $LC11, (%esp)"); // quebra de linha
asm ("call _printf");


Grato, a quem ajudar !!!


  


2. Re: Assembly label inline

3. Re: Assembly label inline

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 16/07/2012 - 18:22h

labels em assembly inline no gcc são ligeiramente diferentes daqueles utilizados diretamente no gas. para labels locais vc precisa utilizar identificadores numéricos. ex: 1: 2: etc
e então os referencia no seu código através de seu número + f ou b.
sendo:
f: label posterior à instrução atual
b: label anterior à instrução atual

ex:
0f (primeiro label 0: após a instrução)
1b (primeiro label 1: antes da instrução)

mais uma coisa, fazendo menção àquela sua questão anterior sobre otimizações: utilize __asm__ __volatile__ para sinalizar seu código asm, a fim de evitar que o compilador aplique otimizações em suas instruções asm (caso seja de sua vontade que este seja o comportamento).

__asm__ __volatile__ {
.... seu código...
};


4. Re: Assembly label inline

???
gokernel

(usa Linux Mint)

Enviado em 16/07/2012 - 19:51h


Olá pessoal, grato pelo retorno !!!

Bom, ja resolvi aqui assim:
-------------------------------

// no inicio do arquivo fiz exatamente assim para forçar a criacao de um label ( LC0: )
char *BlaBlaBla = "%d\n";


// e dentro da funcao fiz assim:
// passa o valor do "REGISTRO"(a) para o registrador EAX
asm ("movl %0, %%eax" : /*OutPut*/ : "a"( a ));
// passa o valor de EAX para o/a STACK
asm ("movl %eax, 4(%esp)"); // valor
// passa o valor do label ( QUEBRA LINHA ) para STACK
asm ("movl $LC0, (%esp)"); // quebra de linha
// chama a funcao com "1"(int a) parametro
asm ("call _printf");
-------------------------------

E valeu mslomp pela dica ... vou sim utilizar do modo que vc informou no meu "BYTECODE" ...

Abraço !






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts