ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Assembly in line [RESOLVIDO]
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Qui Jan 09, 2014 12:43 pm    Assunto: Assembly in line [RESOLVIDO] Responder com Citação

Alguém entende de assmebly ai? Enfim, estava fazendo uns testes criando rotina assembly junto ao código Delphi e me deparei com um problema.

O Delphi não consegue executar as instruções INT nem PUSH. Alguém sabe me dizer se elas funcionão.

Código que estou tentando executar:

Código:
procedure Cls();
 asm
    MOV AH, $0F  //Função retorna modo de video em AL
    INT $10

    MOV AH, $0   //Função que altera o modo de video em AL.
    INT $10
 end;


begin
  Cls();
end.


Aplicação Console. Quando é executado é lançado uma exceção de acesso violado a memória.


Editado pela última vez por wprmsite em Seg Jan 13, 2014 5:15 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Qui Jan 09, 2014 3:30 pm    Assunto: Responder com Citação

Já programei há muito tempo atrás em assembly, esse codigo deveria funcionar em maquinas DOS onde não há proteção de memória, é provável que não funcione em Windows onde há muito mais proteções, por isso a exceção foi lançada.

A falha não é do Delphi, mas da implementação que deve estar faltando instruções, uma vez que não deve ser mais a mesma implementação que era feita para DOS.

Mas também não sei te dizer como faz, pois nunca mais mexi com isso.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Qui Jan 09, 2014 3:52 pm    Assunto: Responder com Citação

Tem outra coisa, não sei se o delphi salva os registradores antes de usar então acho que estaria mais correto assim :

Código:
procedure Cls();
 asm
    PUSH AX

    MOV AH, $0F  //Função retorna modo de video em AL
    INT $10

    MOV AH, $0   //Função que altera o modo de video em AL.
    INT $10

    POP AX
 end;


begin
  Cls();
end.

_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Qui Jan 09, 2014 11:18 pm    Assunto: Responder com Citação

Ola claudio.ferreira. A implementação esta correta. Rodei este código assembly com o montador DEBUG.EXE, presente no próprio Windows XP e 7. Talvez seja a proteção de memória como você citou. Mas neste caso o programa que montei com o DEBUG também não deveria dar erro?

Por isso esta minha dúvida. É o delphi que não suporta ou o que?

ALIAS, aqui esta o código completo que usei no DEBUG:

Código:
100 JMP SHORT 10B
102 DB 'oi mundo$'

10B MOV   AH, 9
... MOV   DX, 102
... INT   21

... MOV   AH, 1
... INT   21

... MOV   AL,0
... MOV   AH,0
... INT   21

... MOV   AH, 4C
... INT   21
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Jan 10, 2014 12:31 am    Assunto: Responder com Citação

O Windows XP, vista, seven e 8 tem uma camada de proteção ao hardware, portanto esqueça tais instruções, vc somente vai conseguir se for num Windows anterior, ou utilizando o conceito WDM - Windows Driver Model, somente através deste conceito é que vc consegue acessar instruções de baixo nível que acessa o hardware em si.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Sex Jan 10, 2014 11:08 am    Assunto: Responder com Citação

johnny-walker você diz que não é possível executar estas instruções a partir de uma linguaguem de alto nível ou de qualquer outra forma, no Windows XP em diante?

Isto é, sem aplicar o cenceito citado por você, WDM.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Jan 10, 2014 12:23 pm    Assunto: Responder com Citação

Atualmente por medida de segurança a Microsoft criou uma camada segurança de abstração do hardware, por isto vc não tem acesso direto mais ao hardware, caso vc tente acessar sempre dará priviledge instrutions.
Esta abstração é do kernel, assim para vc chamar tal terá de utilizar o modo protegido do kernel para acessar tais privilégios no espaço de usuário, apenas no modo de super usuário escrevendo um driver conseguirá tal.

Eis uma explicação melhor em inglês:
http://stackoverflow.com/questions/16055432/how-can-i-read-from-physical-memory


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Sex Jan 10, 2014 1:22 pm    Assunto: Responder com Citação

Meu entendimento bate com o do Jhony, mas não só a memória de usuário que não pode ser acessada, penso que as interrupções também não podem mais ser chamadas diretamente como se fazia no DOS, Win95 e Win98,

Agora tem que chamar API do Windows equivalente à interrupção ou então se desejar mesmo chamar a INT tem que obedecer o WDM - Windows Driver Model, por isso disse que o codigo estaria imcompleto.

Não sei porque o seu codigo funcionou no Debug e não no Delphi. Eu programava em Microsoft Macro Assembler, nunca usei o Assembler inline do Delphi, aliás usei uma vez mas foi no Turbo Pascal.

Testou a INT 10 no debug ? veja se funciona..
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Sáb Jan 11, 2014 1:37 am    Assunto: Responder com Citação

Criei um programa simples em assembly estilo HELLO WORLD.

SO: Windows 7 Home Premium

Montadores: TASM e TLINK.

Funcionou perfeitamente, sem problema algum. Ainda sim acho que o problema não é o SO.

Programa(Testado no Windows 7 e XP): http://www.4shared.com/rar/jgS0Uxr7ce/Exemplo_ASM_Win7.html?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Sáb Jan 11, 2014 1:07 pm    Assunto: Responder com Citação

É pode não ser o SO, mas veja que uma coisa é voce gerar executável para rodar no modo antigo em DOS o que o TASM/TLINK e no meu caso o MASM/LINK fazem. Outra coisa é gerar executáveis para rodarem debaixo de Windows preparados para lidar com outras características e modelo diferentes de acesso a memórias.

O delphi gera executáveis preparados para rodar em Windows e mesmo o executável console do Delphi não deve gerar executáveis formatados no modelo antigo "DOS"
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Sáb Jan 11, 2014 10:34 pm    Assunto: Responder com Citação

Isto mesmo claudio.ferreira. Depois de passar a noite quase toda lendo sobre o assunto, percebi que estas interrupções só funcionam em aplicações DOS.

E como você disse, o deplhi gera aplicações Win32. Por este motivo não funcionam.

Mas percebi algo. Tudo bem as interrupções 20,21,23,27 e etc não funcionarem em Win32 pois são interrupções pertencentes ao DOS. Mas e as interrupções da BIOS, como a INT 10?

Será devido a proteção do windows citada anteriormente?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Dom Jan 12, 2014 1:38 pm    Assunto: Responder com Citação

É a proteção. Na verdade creio que o windows não faz distinção entre as interrupções, seja de BIOS ou DOS.

Imagine se o Windows ia permitir que voce mudasse o modo ou resolução de vídeo por fora de seus controles internos e com isso podendo causar um travamento do SO ou mesmo uma instabilidade ?

antigamente era mais fácil não existiam muitos controles, agora tudo é controlado com objetivo de não causar acessos indevidos a memórias, travamentos, etc.. o antigo GPF (pra quem já trabalhou com Win95 e Win98 e 3.1)

A proteção funciona mais ou menos assim :

O Windows ao inicializar salva todos os endereços originais das INTs e coloca na tabela de endereços de INTs um desvio para suas próprias rotinas então o processador ao chamar uma INT não chama a original, mas a do windows desviada, lá ele faz a checagem se está tudo dentro dos conformes, quem chamou se tem permissão, etc.. e aí se tudo estiver ok ele chama a INT original, se não solta uma exceção, ou qualquer outro tipo de parada no processamento.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Dom Jan 12, 2014 2:36 pm    Assunto: Responder com Citação

Obrigado por esclarecer claudio.ferreira. Conhece algum artigo ou algo do tipo que ensine a criar rotinas com estas permissões, ou pelo menos como obtê-lá?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Seg Jan 13, 2014 9:24 am    Assunto: Responder com Citação

Realmente não sei. Parei meus estudos por aí. Estude como fazer um device driver, é o caminho. Ao escrever um device driver voce terá o direito de usar as INTs porque está escrevendo de acordo com as especificações e terá as devidas permissões.

A memória física somente pode ser lida a partir de codigo escrito no espaço do kernel, e para se escrever codigo que faça parte do kernel, só fazendo device driver.

A menos que meu entendimento esteja equivocado, não há muitas portas de entrada para se codificar em assembler e poder usar as INTs, o windows restringiu esse tipo de programação do hardware porque ele quer voce utilize as APIS e não programe o hardware diretamente, a menos que como disse voce faça um device driver controlador de algum dispositivo.

Ao escrever por exemplo um device driver para a placa de vídeo poderá escrever codigo para mudar a resolução do vídeo e o windows permitirá pois não há ninguém que possa fazer melhor do que um device driver.

E um device driver se escreve usando o modelo citado anteriormente pelo Jhony - WDM - Windows Driver Model

http://msdn.microsoft.com/en-us/library/windows/hardware/ff565698%28v=vs.85%29.aspx
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
wprmsite
Novato
Novato


Registrado: Sábado, 20 de Outubro de 2012
Mensagens: 45

MensagemEnviada: Seg Jan 13, 2014 5:12 pm    Assunto: Responder com Citação

Beleza. Muito Obrigado pessoal. Vou dá uma estuda no assunto e qualquer coisa posto os resultados aqui.

Valeu, obrigado novamente!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB