GARANTIR DESCONTO

Fórum [soc] - asm no delphi #209421

26/01/2004

0

Pessoal...

Alguem sabe usar ´Asm´ no delphi?

Bom eu sei q eh so declarar
program;
begin
<codigo principal>

asm
<codigo asm>
end;//asme

end;//principal

mas a minha duvida eh a seguinte.... eu queria fazer tipo um calculo p serial...
entaum eu teria q pegar o username q o usuario escreveria num edit...

1 DUVIDA : como eu jogo uma var string no algoritmo em asm?

dae supondo q eu fiz os calculos em asm do serial... eu preciso devolver o serial em outro edit...

2 DUVIDA : como eu pego o resultado do asm?

-------------
Pelo q eu sei... o asm so deve aceitar char, ou talvez tbm Pchar, certo?
Pq ele usa registradores e talz...


Osocram

Osocram

Responder

Posts

26/01/2004

Maicongabriel

1 DUVIDA : como eu jogo uma var string no algoritmo em asm?
Não joga, passa Char/PChar

dae supondo q eu fiz os calculos em asm do serial... eu preciso devolver o serial em outro edit... 2 DUVIDA : como eu pego o resultado do asm?
Não pega, você MOVE

Pelo q eu sei... o asm so deve aceitar char, ou talvez tbm Pchar, certo? Pq ele usa registradores e talz...
E talz, poiz eh, se você não domina Asm, pq pretende utiliza-lo ? Digo isso, pq no fim é tudo a mesma ´coisa´, ou a sua função de montar um serial é muiiiiiiiiiiito pesada? Se fosse isso, ai sim, tudo bem...


Responder

Gostei + 0

26/01/2004

Osocram

Ok... eh o seguinte...

Eu to querendo aprender um pouco d asm... esse q eu quero fazer eh leve... poderia fazer mto bem em delphi mesmo... Mas to querendo aprender um pouco d ASM... serah q vc poderia dar um ex d como q eu faco p resolver as minhas duvidas q eu passei acima?

Obrigado.

(eu jah andei estudando um pouco os codigos em assembler... tipo o basico mesmo..)


Responder

Gostei + 0

26/01/2004

Cebikyn

Para passar os valores, vc pode fazer uma função ou procedure totalmente em assembler e os parâmetros são desta forma:

function FastCharMove(parametro1; parametro2; parametro3);
asm
  // O Delphi põe os parâmetros automaticamente assim:
  // ECX = parametro1
  // EAX = parametro2
  // EDX = parametro3
  // Qnd tem mais de 3 parâmetros, eles são passados na stack
  // O resultado da função tem um registrador específico, mas eu esqueci
end;


Ou se preferir, vc pode colocar o asm... end dentro do begin..end (como mostrado na sua primeira msg) e fazer um MOV entre um registrador e uma variável comun (como se estivesse fazendo entre dois registradores) vc pode fazer desta forma para entrada ou saida de dados na função, tipo um MOV entre um registrador e o result por exemplo.


Responder

Gostei + 0

26/01/2004

Osocram

Hummmm

Eh acho q entendi sim.... acho q hj a noite vou testar isso... dae se eu tiver duvidas... vc vai ficar sabendo
hehehehehe

Mas por enqto valeu...

Eh mto dificil encontrar ajuda nesse assunto....

Ah.. vc sabe tem alguns tutoriais ou paginas q explicam sobre isso?
Poderia me passar?

Valeu.. vou testar isso q vc me passou.


Responder

Gostei + 0

26/01/2004

Cebikyn

Sites e páginas sobre ASM no Delphi:

[b:c542d63f4a]Inline Assembler in Delphi (I) - Introduction[/b:c542d63f4a]
http://www.delphi3000.com/articles/article_3766.asp
(no mesmo lugar vc encontra as outras partes, falando sobre AnsiStrings, Arrays, Objetos, etc...)

[b:c542d63f4a]Programação Assembly[/b:c542d63f4a] - em português
http://www.geocities.com/SiliconValley/Park/3174/prog/asm/asm.htm


Responder

Gostei + 0

26/01/2004

Maicongabriel

Tem também a função que o [b:c2a306bf7b]cebikyn[/b:c2a306bf7b] esqueceu de te passar completa...
//My move is not as fast as MOVE when source and destination are both
//DWord aligned, but certainly faster when they are not.
//As we are moving characters in a string, it is not very likely at all that
//both source and destination are DWord aligned, so moving bytes avoids the
//cycle penality of reading/writing DWords across physical boundaries
procedure FastCharMove(const Source; var Dest; Count : Integer);
asm
//Note:  When this function is called, delphi passes the parameters as follows
//ECX = Count
//EAX = Const Source
//EDX = Var Dest

        //If no bytes to copy, just quit altogether, no point pushing registers
        cmp   ECX,0
        Je    @JustQuit

        //Preserve the critical delphi registers
        push  ESI
        push  EDI

        //move Source into ESI  (generally the SOURCE register)
        //move Dest into EDI (generally the DEST register for string commands)
        //This may not actually be neccessary, as I am not using MOVsb etc
        //I may be able just to use EAX and EDX, there may be a penalty for
        //not using ESI, EDI but I doubt it, this is another thing worth trying !
        mov   ESI, EAX
        mov   EDI, EDX

        //The following loop is the same as repNZ MovSB, but oddly quicker !
    @Loop:
        //Get the source byte
        Mov   AL, [ESI]
        //Point to next byte
        Inc   ESI
        //Put it into the Dest
        mov   [EDI], AL
        //Point dest to next position
        Inc   EDI
        //Dec ECX to note how many we have left to copy
        Dec   ECX
        //If ECX <> 0 then loop
        Jnz   @Loop

        //Another optimization note.
        //Many people like to do this

        //Mov AL, [ESI]
        //Mov [EDI], Al
        //Inc ESI
        //Inc ESI

        //There is a hidden problem here, I wont go into too much detail, but
        //the pentium can continue processing instructions while it is still
        //working out the result of INC ESI or INC EDI
        //(almost like a multithreaded CPU)
        //if, however, you go to use them while they are still being calculated
        //the processor will stop until they are calculated (a penalty)
        //Therefore I alter ESI and EDI as far in advance as possible of using them

        //Pop the critical Delphi registers that we have altered
        pop   EDI
        pop   ESI
    @JustQuit:
end;



Responder

Gostei + 0

26/01/2004

Osocram

:D
Valeuuuuuuuuuuuuu, vcs ajudaram bastante...

acho q c essas dicas eu jah posso aprender bem o basico d asm no delphi...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar