Alterar variбveis com #emit -
ipsBruno - 27.09.2013
Essa й a terceira etapa do tutorial. Bem, essa й um pouco mais complicada, mas nгo impede ninguйm de entender, na verdade essa etapa apenas serб para variбveis com STOR e LOAD e futuramente estarei explicando melhor STACK e os outros operadores que #emit dispхe.
Em #emit. Tem dois opcodes bastante importantes chamados STOR E LOAD. Basicamente, LOAD carrega, e STOR SALVA. Como de costume, й tudo baseado em registros primбrios e secundбrios, portanto, novamente as operaзхes serгo feitas em PRI E ALT.
Quando usamos
pawn Код:
#emit LOAD.S.PRI VARIAVEL
basicamente vocк estarб carregando o valor da VARIAVEL para o registro PRIMБRIO. E quando usamos
pawn Код:
#emit LOAD.S.ALT VARIAVEL
estaremos carregando no registro secundбrio. Como de padrгo, podemos usar os operadores aritmйticos, que ensinei no tutorial anterior. Logo podemos montar algo como
Quanto й 10 + 5?
pawn Код:
new var1 = 5;
new var2 = 10;
new resultado;
// carrega o valor de var1 na memуria PRIMARIA
#emit LOAD.S.PRI var1
// carrega valor de var2 na memуria SECUNDARIA
#emit LOAD.S.ALT var2
// como ensinei antes, vai somar o valor de PRI + ALT ou (5 + 10 conforme as variбveis)
#emit ADD
Pois bem, executamos a soma de var1 + var2. Porйm, como vamos retornar os dados senгo com RETN? Simples, й pra isto que vem STOR, que irб salvar os dados em resultado. Apenas usando
pawn Код:
// vai salvar o resultado de var1 + var2 na variбvel resultado. Sempre use PRI nestes casos, pois й a memуria principal e й onde o valor das operaзхes ficam salvas
#emit STOR.S.PRI resultado
// imprimir para checar
printf("var1 + var2 = %d", resultado);
Mas e Bruno, podemos usar outros operadores alйm de ADD?
Claro! Muitos operadores sгo aceitos, em especial os aritmйticos que ensinei na etapa anterior. Basta fazer:
Multiplicar
pawn Код:
new var1 = 5;
new var2 = 10;
new resultado;
#emit LOAD.S.PRI var1
#emit LOAD.S.ALT var2
#emit SMUL // multiplica var1 x var2
#emit STOR.S.PRI resultado
printf("%d", resultado);
Subtrair
pawn Код:
new var1 = 5;
new var2 = 10;
new resultado;
#emit LOAD.S.PRI var1
#emit LOAD.S.ALT var2
#emit SUB // subtrai var1 - var2
#emit STOR.S.PRI resultado
printf("%d", resultado);
e qualquer outra operaзгo que mostrei antes. Alйm disto, se pensares bem, tambйm pode atй trocar o valor das variбveis, uma pela outra
pawn Код:
new var = 10;
new vor = 20;
printf("%d e %d", vor, var);
#emit LOAD.S.PRI var
#emit LOAD.S.ALT vor
#emit STOR.S.PRI vor // coloca VAR em VOR
#emit STOR.S.ALT var // coloca VOR em VAR
printf("%d e %d", vor, var);
E simplesmente, alterou os valores:
Код:
[10:32:35] 20 e 10
[10:32:35] 10 e 20
Simples nгo?
Abraзos
Re: Alterar variбveis com #emit -
RuanRider - 27.09.2013
da pra fazer uma calculadora xD
Re: Alterar variбveis com #emit -
ipsBruno - 27.09.2013
Quote:
Originally Posted by RuanRider
da pra fazer uma calculadora xD
|
Й uma coisa bem bбsica que se pode fazer com #emit. Se por para estudos й bastante viбvel sim.
Re: Alterar variбveis com #emit -
WLSF - 27.09.2013
Great job Brunoips
queria eu gostar dessas coisas, mas vou continuar manipulando valores da forma comum mesmo.
Re: Alterar variбveis com #emit -
Falcon. - 27.09.2013
Entгo, idependente da operaзгo que se faz:
ADD, SMUL, SUB, IDXADDR. O valor final sempre estarб em
PRI ?
Re: Alterar variбveis com #emit -
WLSF - 27.09.2013
Quote:
Originally Posted by Falcon.
Entгo, idependente da operaзгo que se faz: ADD, SMUL, SUB, IDXADDR. O valor final sempre estarб em PRI ?
|
Atй aonde eu sei sim, o alternativo jб diz pelo nome, sу й utilizado como secundбrio para poder executar as operaзхes em cima dos dois (pri, alt)
Й como se vocк tivesse movendo o resultado aritmйtico final para lб:
pawn Код:
_asm
{
mov eax, 4
mov ecx, 5
add eax, ecx
ret
}
Corrijam-me se eu estiver errado.
Re: Alterar variбveis com #emit -
ipsBruno - 27.09.2013
Quote:
Originally Posted by Falcon.
Entгo, idependente da operaзгo que se faz: ADD, SMUL, SUB, IDXADDR. O valor final sempre estarб em PRI ?
|
Nem sempre, hб opcodes que podem usar ambos registros. Mas normalmente, й em PRI que se encontra o resultado das operaзхes aritmйticas bбsicas
ADENDO
Assim como no tutorial de aritmйtico, tambйm podemos usar CONST e STOR E LOAD ao mesmo tempo.
Por exemplo var += 5 seria equivalente hб:
pawn Код:
// adicionar valor 5 em alt
#emit CONST.ALT 5
// carregar var em pri
#emit LOAD.S.PRI var
// adicionar var + 5
#emit ADD
// pegar o valor registro e salvar na var de volta
#emit STOR.S.PRI var
Re: Alterar variбveis com #emit -
Falcon. - 28.09.2013
Bruno, й possнvel de alguma forma carregar o valor de ALT em PRI sem usar variбveis ?
pawn Код:
#emit CONST.ALT 5
#emit CONST.PRI CONST.ALT
Valeu pelos tutoriais. Jб consegui pegar tudo que vocк postou atй agora, e estou tentando imaginar onde o uso de #emit ficaria melhor em alguns cуdigos meus.
Re: Alterar variбveis com #emit -
ipsBruno - 28.09.2013
sу usar
rs
Re: Alterar variбveis com #emit -
zSuYaNw - 28.09.2013
Quote:
Originally Posted by ipsBruno
|
Nгo caar,ele estб tentando manipular valores sem usar variбveis,