[Tutorial] #emit IDXADDR
#1

Vou comeзar a fazer uma listinha de tutoriais, com alguns truques que ando aprendendo em #emit. Pra quem nгo sabe o que й isto, favor, veja os seguintes links:


https://sampforum.blast.hk/showthread.php?tid=360155
https://sampforum.blast.hk/showthread.php?tid=315531


Como podem ver, ambos tutoriais estгo incompletos. Porque й simplesmente dнficil demais, ensinar #emit, tem muitos opcodes (que nem eu mesmo consegui aprender) e por este motivo й necessбrio que se faзam muitos tutoriais. Pois bem, antes de tudo. Vocкs devem saber o bбsico de #emit para pelo menos entender esse tutorial.


Nesse pequeno tutorial, vou explicar como й o uso do opcode IDXADDR. Que nгo foi bem explicado em alguns tutoriais. Vamos lб!



Basicamente, quando vocк carrega uma array para memуria em #emit

pawn Code:
#emit LOAD.S.alt array
Vocк nгo poderб manipular os valores internos dela, por isto existe o IDXADDR, que basicamente й a abreviatura de INDEX ADDRESS, pois vocк estб pegando o valor address INDEX de uma array atravйs do endereзo dela. Entenderam? Nгo?

Vou explicar melhor:

Quando vocк tem

PHP Code:
new array [] = {1,2,3,4,5}; 
Em #emit, й muito complicado pegar um ъnico valor desta array (seja 1,2,3,4 ou 5) por este motivo, usando IDXADDR vocк pode combinar o armazenamento ALT (alternativo) com o PRI (primбrio) e pegar algum desses valores de dentro da array, nesse caso, pegarб o endereзo deles, simplesmente fazendo


pawn Code:
new array[] = {1,2,3,4,5};
   
    new idx = 2; // irei pegar o endereзo do elemento 2 da array, no caso da parte 3
   
    new arrayvalue; // cйlula para armazenamento do valor
   
    // carregar array para o registro alternativo
    #emit LOAD.S.alt array
   
    // carregar o valor de idx para o registro primбrio
    #emit LOAD.S.pri idx
   
    // IDXADDR, neste caso iria armazenar no registro prнmario: array[iter]
    #emit IDXADDR
   
    // para demonstraзгo, salvarei o valor de array[idx] em arrayvalue
    #emit STOR.S.pri arrayvalue
   
    // mбgica! arrayvalue agora tem o valor address da array, que era array[idx] addr
    printf("%d", arrayvalue);

EXEMPLO:

Serve para pegar valores na array (уbvio), veja o exemplo:

pawn Code:
new array[] = {48481,184};

printf("%d", getidx(array, 1)); // 184

stock getidx(arr[], idx) {

    // carrega no registro primбrio o idx
    #emit LOAD.S.pri    idx
   
    // carrega a array no registro secundario
    #emit LOAD.S.alt    arr
   
    // pega o endereзo de arr[idx]
    #emit IDXADDR
   
    // armazena o valor do endereзo em idx
    #emit STOR.S.pri    idx
   
    // carrega a array
    #emit LOAD.I
   
    // armazena o valor de arr[idx] em idx agora
    #emit STOR.S.pri    idx
   
    // retorna o valor encontrado
    #emit RETN
   
    // faзa o compilador feliz
    return 0;
}
Viram? Й simples, mas pode-se usar para muitas coisas. Logo que eu puder, estarei fazendo outros tutoriais referente a outros opcodes nгo mostrados no tutorial do rjj.


Qualquer erro no tutorial avisem.


Abraзos
Reply


Messages In This Thread
#emit IDXADDR - by ipsBruno - 27.09.2013, 06:20
Re: #emit IDXADDR - by Schocc - 27.09.2013, 06:34
Re: #emit IDXADDR - by Caio_Freeze - 27.09.2013, 06:34
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 06:38
Re: #emit IDXADDR - by zSuYaNw - 27.09.2013, 06:47
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 06:56
Re: #emit IDXADDR - by zSuYaNw - 27.09.2013, 06:58
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 07:10
Re: #emit IDXADDR - by Schocc - 27.09.2013, 07:28
Re: #emit IDXADDR - by zSuYaNw - 27.09.2013, 07:29
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 07:31
Re: #emit IDXADDR - by RuanRider - 27.09.2013, 13:29
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 13:32
Re: #emit IDXADDR - by RuanRider - 27.09.2013, 13:35
Re: #emit IDXADDR - by ipsBruno - 27.09.2013, 13:38
Re: #emit IDXADDR - by zPain - 28.09.2013, 21:56
Re: #emit IDXADDR - by ipsBruno - 29.09.2013, 02:47

Forum Jump:


Users browsing this thread: 1 Guest(s)