| Exibir mensagem anterior :: Exibir próxima mensagem | 
	
	
		| Autor | Mensagem | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Qui Jan 09, 2014 12:43 pm    Assunto: Assembly in line [RESOLVIDO] |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Qui Jan 09, 2014 3:30 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Qui Jan 09, 2014 3:52 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Qui Jan 09, 2014 11:18 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| johnny-walker Moderador
 
  
  
 Registrado: Sábado, 4 de Outubro de 2003
 Mensagens: 10653
 Localização: Contagem/MG - BRAZIL
 
 | 
			
				|  Enviada: Sex Jan 10, 2014 12:31 am    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Sex Jan 10, 2014 11:08 am    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| johnny-walker Moderador
 
  
  
 Registrado: Sábado, 4 de Outubro de 2003
 Mensagens: 10653
 Localização: Contagem/MG - BRAZIL
 
 | 
			
				|  Enviada: Sex Jan 10, 2014 12:23 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Sex Jan 10, 2014 1:22 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Sáb Jan 11, 2014 1:37 am    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Sáb Jan 11, 2014 1:07 pm    Assunto: |   |  
				| 
 |  
				| É 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Sáb Jan 11, 2014 10:34 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Dom Jan 12, 2014 1:38 pm    Assunto: |   |  
				| 
 |  
				| É 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Dom Jan 12, 2014 2:36 pm    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| claudio.ferreira Profissional
 
  
  
 Registrado: Quarta-Feira, 18 de Setembro de 2013
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Seg Jan 13, 2014 9:24 am    Assunto: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| wprmsite Novato
 
  
 
 Registrado: Sábado, 20 de Outubro de 2012
 Mensagens: 45
 
 
 | 
			
				|  Enviada: Seg Jan 13, 2014 5:12 pm    Assunto: |   |  
				| 
 |  
				| Beleza. Muito Obrigado pessoal. Vou dá uma estuda no assunto e qualquer coisa posto os resultados aqui. 
 Valeu, obrigado novamente!
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		|  |