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

Muito bom nota 10

Seria нndice de endereзo?
Reply
#3

Muito bom apesar de ser mto avanзado pra min '-'
Reply
#4

Quote:
Originally Posted by Schocc
View Post
Muito bom nota 10

Seria нndice de endereзo?
Sim, com isto dб para pegar o valor do нndice da array, ou atй fazer trocas de valores, ou manipular toda a array por si. Й bem fбcil.
Reply
#5

Nгo conhecia este opcode. bom trabalho DraKoN.
Reply
#6

Й ipsBruno

Adicionei um exemplo ao cуdigo. Abraзos
Reply
#7

й possнvel com strings?
Reply
#8

Perfeitamente, sу que os valores manipulados serгo em decimais. Mas normal, sу imprimir com %c


pawn Code:
new string[] = "Suyanw boiola";
printf("%c", getidx(string, 5)); // retorna w
Reply
#9

legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Reply
#10

Quote:
Originally Posted by Schocc
View Post
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Creio que a diferenзa seria minima.
Reply
#11

Quote:
Originally Posted by Schocc
View Post
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Nгo tem muito o que fazer com #emit. Na verdade nгo tem quase nada haver.

#emit apenas serve para manipular a memуria de forma bruta, nгo tem muita utilidade quando utilizado em jogo.
Reply
#12

tem sу %c e %d?
creio que nгo, me mostra outros ae?
Reply
#13

que eu lembro, sгo estes. mas hб como fazer mais.

%s %b %x %i %c %% %f %d

mas pode manipula-los com

%20s ou %0.3f %02d etc.

se estiver em sscanf, hб outra gama tambйm

p<delim>, u, s,i,d,z,b,p,a,h,x,o,r,g,s[N],a<especificadores>[size],{opcional},(Ns),e<especificadores>


tambйm tem os carriers

\n \a \r \\ \xN \bN (n = numero no formato)
Reply
#14

qual o resultado dessas manipulaзхes? %20s, %0.3f ..

e qual o nome dado isso %letra?
Reply
#15

%20s vai completar com espaзos o que falta

PHP Code:
printf("'%08s'""Bruno"); 
Bruno tem 5 caracteres, mas sгo 8. Entгo completa 3 com espaзos


%0.3f vai literalmente pegar sу atй X nъmeros apуs casas decimais

PHP Code:
printf("%0.3f"1.16819841); 
vai imprimir sу 1.16


%04d preenche com zeros um inteiro


algo como:

PHP Code:
printf("%04d"10); 
Sгo duas casas, mas eu pedi 4. Entao ele completa 2 com zeros a esquerda

0010




O nome %letra na programaзгo pode ser placeholder ou especificadores (specifiers). Depende qual objetivo da funзгo. Em sscanf, quando nгo se usa % se chama especificador, pois especifica o tipo de dado imposto. Em format %letra se chama placeholder, pois % й substituнdo pela variбvel indicada


EDITADO

Esqueci do carrier de tab tambйm \t
Reply
#16

Eu escrevi uma funзгo similar а sua getidx, mas fiquei com uma pequena dъvida:


Seu cуdigo:
pawn Code:
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;
}

Meu cуdigo:
pawn Code:
stock GetArrayIndex(array[], index)
{
    #emit LOAD.S.PRI index
    #emit LOAD.S.ALT array

    #emit IDXADDR

    #emit STOR.S.PRI index
    #emit LOAD.I

    #emit RETN
    return 0;
}

Repare que eu nгo executo um novo STOR apуs o LOAD. Existe alguma razгo especнfica para que vocк faзa isso?
Reply
#17

Erro meu. Nгo hб necessidade de STOR apуs o LOAD.I, й que quando fiz a funзгo ela retornava em IDX, entгo eu modifiquei o cуdigo para RETN e acabei deixando o STOR ali.


Abraзos
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)