[Tutorial] Alterar variбveis com #emit
#1

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
Reply
#2

da pra fazer uma calculadora xD
Reply
#3

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.
Reply
#4

Great job Brunoips

queria eu gostar dessas coisas, mas vou continuar manipulando valores da forma comum mesmo.
Reply
#5

Entгo, idependente da operaзгo que se faz: ADD, SMUL, SUB, IDXADDR. O valor final sempre estarб em PRI ?
Reply
#6

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.
Reply
#7

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
Reply
#8

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.
Reply
#9

sу usar

pawn Код:
#emit ADD
rs
Reply
#10

Quote:
Originally Posted by ipsBruno
Посмотреть сообщение
sу usar

pawn Код:
#emit ADD
rs
Nгo caar,ele estб tentando manipular valores sem usar variбveis,
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)