bornman Postado Janeiro 12, 2018 em 22:21 Compartilhar Postado Janeiro 12, 2018 em 22:21 Olá pessoal, estou lendo um livro de assembly e estava programando usando Tasm, porém mudei para o Masm pois acredito ser melhor para programar para windows. O problema é que estou me sentindo perdido, não consigo nem fazer um Hello world. Gostaria que alguém me mostrasse um caminho para eu melhorar, agradeço desde já. Link para o comentário Compartilhar em outros sites More sharing options...
Pimptech Postado Janeiro 13, 2018 em 04:16 Compartilhar Postado Janeiro 13, 2018 em 04:16 Olá, @bornman! Tudo bem ? Cara achei algumas coisas interessantes. Eu me do melhor com NASM. De qualquer modo, se já programou em TASM é só questão de pegar o jeitão mesmo. Alguns exemplos: http://masm32.com/board/index.php?board=60.0 Guia do MASM (Anexado no post): http://masm32.com/board/index.php?topic=3445.msg39012#msg39012 Aqui tem quase tudo (Recomendo, direto ao ponto): http://win32assembly.programminghorizon.com/tutorials.html Espero ter ajudado. Abraço! Link para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Janeiro 13, 2018 em 21:08 Autor Compartilhar Postado Janeiro 13, 2018 em 21:08 16 horas atrás, Pimptech disse: Olá, @bornman! Tudo bem ? Cara achei algumas coisas interessantes. Eu me do melhor com NASM. De qualquer modo, se já programou em TASM é só questão de pegar o jeitão mesmo. Alguns exemplos: http://masm32.com/board/index.php?board=60.0 Guia do MASM (Anexado no post): http://masm32.com/board/index.php?topic=3445.msg39012#msg39012 Aqui tem quase tudo (Recomendo, direto ao ponto): http://win32assembly.programminghorizon.com/tutorials.html Espero ter ajudado. Abraço! Opa, obrigado amigo, já dei uma olhada nos links. Uma coisa que não estou entendo é que na hora de executar meu programa nada acontece, você tem ideia do que eu posso estar fazendo errado? Link para o comentário Compartilhar em outros sites More sharing options...
Pimptech Postado Janeiro 14, 2018 em 01:48 Compartilhar Postado Janeiro 14, 2018 em 01:48 4 horas atrás, bornman disse: Opa, obrigado amigo, já dei uma olhada nos links. Uma coisa que não estou entendo é que na hora de executar meu programa nada acontece, você tem ideia do que eu posso estar fazendo errado? Podem ser várias coisas. Sem o código é complicado dizer. O que o programa deveria fazer ? Link para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Janeiro 14, 2018 em 12:30 Autor Compartilhar Postado Janeiro 14, 2018 em 12:30 10 horas atrás, Pimptech disse: Podem ser várias coisas. Sem o código é complicado dizer. O que o programa deveria fazer ? Então, no Tasm para eu fazer uma mensagem aparecer no console eu usava o código: lea dx, msg mov ah, 09h int 21h Agora no MASM32 estou tentando com a library Irvine32, esse é o código: .386 .model flat, stdcall includelib \masm32\lib\Kernel32.lib includelib \masm32\lib\User32.lib includelib \masm32\lib\Irvine32.lib include \masm32\include\irvine32.inc .stack 4096 .data msg byte "Oi mundo", 0dh, 0ah, 0 .code main Proc mov edx, offset msg call WriteString exit main Endp end main Link para o comentário Compartilhar em outros sites More sharing options...
gzn Postado Janeiro 14, 2018 em 19:06 Compartilhar Postado Janeiro 14, 2018 em 19:06 Se for só para aprendizado mesmo você pode fazer como eu, usar as ferramentas do GNU toolchain pra windows (mingw). Até porque se falamos de assembly, temos que ter em mente que não vamos criar um aplicativo nessa linguagem, isso não seria trivial rs =) Qual a vantagem do NASM e do MASM se temos o GAS tanto pra windows com pra linux? Essa é uma pergunta que tenho na minha cabeça... hmmm O kit de desenvolvimento com GNU toolchain já vem com linker e até compilador de C. Com o GNU GAS se você não sabe fazer algo você pode gerar um assembly a partir do C e ver como se faz uma chamada específica, etc. Com esses outros aí você sempre está dependente de outras ferramentas... Fora que se você aprender a usar o GAS vai saber como usá-lo tanto no Windows como no Linux. Bem, podem haver limitações de usar o GAS, mas acho que para os passos iniciais talvez não tenha problemas, não é verdade? Eu uso o mingw gerado pelo projeto cygwin: i686-w64-mingw32-gcc -S código.c -o código.s Aí eu tiro mais ou menos minha dúvida de como se reproduz algo de C para assembly. O único problema até o momento que eu encontrei foi que o mingw gera símbolos no formato DWARF e o x64dbg só aceita PDB eu acho. P.S.: tem uma ferramenta desatualizada que tenta fazer parte desse trabalho de conversão (não testei). Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Janeiro 15, 2018 em 12:18 Compartilhar Postado Janeiro 15, 2018 em 12:18 16 horas atrás, gzn disse: Se for só para aprendizado mesmo você pode fazer como eu, usar as ferramentas do GNU toolchain pra windows (mingw). Até porque se falamos de assembly, temos que ter em mente que não vamos criar um aplicativo nessa linguagem, isso não seria trivial rs =) Qual a vantagem do NASM e do MASM se temos o GAS tanto pra windows com pra linux? Essa é uma pergunta que tenho na minha cabeça... hmmm O kit de desenvolvimento com GNU toolchain já vem com linker e até compilador de C. Com o GNU GAS se você não sabe fazer algo você pode gerar um assembly a partir do C e ver como se faz uma chamada específica, etc. Com esses outros aí você sempre está dependente de outras ferramentas... Fora que se você aprender a usar o GAS vai saber como usá-lo tanto no Windows como no Linux. Bem, podem haver limitações de usar o GAS, mas acho que para os passos iniciais talvez não tenha problemas, não é verdade? Eu uso o mingw gerado pelo projeto cygwin: i686-w64-mingw32-gcc -S código.c -o código.s Aí eu tiro mais ou menos minha dúvida de como se reproduz algo de C para assembly. O único problema até o momento que eu encontrei foi que o mingw gera símbolos no formato DWARF e o x64dbg só aceita PDB eu acho. P.S.: tem uma ferramenta desatualizada que tenta fazer parte desse trabalho de conversão (não testei). Vejo algumas vantagens do NASM sobre o GAS: Sintaxe simplificada usando os mnemônicos oficiais da Intel, já que o GAS, por default, usa mnemônicos no estilo AT&T, onde algumas instruções foram renomeadas, como CWD, CWDE, CDQ. Ele também tem suporte melhor a códigos de 16 bits (8086) e otimizações para processadores específicos (diretiva CPU)... O NASM também suporta a geração de mais arquivos objeto do que o GAS... Em relação ao MASM, por exemplo, o NASM não possui diretivas ASSUME ou o esquisito "tipo PTR" ou "OFFSET", nem mesmo a dualidade do uso de ponteiros, como em: mov eax,var ; mesma coisa que 'mov eax,[var]' No NASM essas duas coisas são diferentes: mov eax,var ; Mesma coisa que 'mov eax,offset var', no MASM mov eax,[var] ; Mesma coisa que 'mov eax,var' ou 'mov eax,[var]', no MASM Ou seja, uma indireção deve ser cercada por [], senão estamos querendo saber o endereço do símbolo... símples e direto. Não há necessidade, também, da diretiva MODEL, já que as sessões (ou segmentos) são especificados diretamente e de forma simples (assim como no GAS). Ahhh... e MinGW não tem nada a ver com o Cygwin Link para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Janeiro 15, 2018 em 13:22 Autor Compartilhar Postado Janeiro 15, 2018 em 13:22 Opa, decidi mudar pro Nasm e até agora estou achando melhor, porém estou tentando fazer um programa que pede um numero e retorna na tela o número digitado, porém na hora de retornar o valor o programa para de funcionar. Segue o código: global _main extern _printf extern _scanf message: db 'Entre com um numero:', 10, 0 msg2: db 'Seu numero eh: %d', 0, 10 num: dd 0h num3: db '%d', 0 section .text _main: push message call _printf add esp, 4 push num push num3 call _scanf push msg2 call _printf add esp, 4 ret Abraços. Link para o comentário Compartilhar em outros sites More sharing options...
gzn Postado Janeiro 15, 2018 em 13:56 Compartilhar Postado Janeiro 15, 2018 em 13:56 1 hora atrás, fredericopissarra disse: Ahhh... e MinGW não tem nada a ver com o Cygwin Perdão @fredericopissarra, quando disse gerado quis dizer compilado. O cygwin tem um sistema de empacotamento particular e algumas coisas tem patches deles, e se não me engano um tempo atrás o mingw deles tinha algumas diferenças em relação ao oficial. Sobre a sintaxe e as instruções que você citou que foram renomeadas isso não muda com a diretiva: .intel_syntax noprefix não? Citar Vejo algumas vantagens do NASM sobre o GAS: Sintaxe simplificada usando os mnemônicos oficiais da Intel, Os mnemonicos pode até ser, mas a sintaxe não. Eu li aqui que o NASM não usa a sintaxe oficial da intel, o MASM sim. Citar NASM actually uses its own variation of Intel syntax, different from the MASM syntax used in Intel's official documentation. Link para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Janeiro 15, 2018 em 18:05 Compartilhar Postado Janeiro 15, 2018 em 18:05 Aqui mesmo no fórum tem um Hello, World com MASM. Link para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Janeiro 15, 2018 em 20:24 Autor Compartilhar Postado Janeiro 15, 2018 em 20:24 2 horas atrás, Fernando Mercês disse: Aqui mesmo no fórum tem um Hello, World com MASM. Já vi esse, porém queria que fosse no console. Link para o comentário Compartilhar em outros sites More sharing options...
gzn Postado Janeiro 15, 2018 em 23:26 Compartilhar Postado Janeiro 15, 2018 em 23:26 Será que não da pra instala algum "visual studio", criar um projeto win32 console app e pedir para gerar só o assembly? hmmm Bom, eu pesquisei aqui na net e achei esse link, nele tem o seguinte código: .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data HelloWorld db "Hello World!", 0 .code start: invoke StdOut, addr HelloWorld invoke ExitProcess, 0 end start Citar Now, open up the command line by going into the Start Menu, clicking on the Run… menu item, and typing in "cmd" without the quotes. Navigate to the directory "hello.asm" is saved in, and type "\masm32\bin\ml /c /Zd /coff hello.asm". Hopefully, there are no errors and your program has been assembled correctly! Then we need to link it, so type "\masm32\bin\Link /SUBSYSTEM:CONSOLE hello.obj". Congratulations! You have successfully created your first assembly program. There should be a file in the folder called Hello.exe. Type "hello" from the command line to run your program. It should output "Hello World!". Lembre-se de colocar essas ferramentas na variável de ambiente PATH (você pode criar um batch file pra isso e chamar o cmd.exe), assim você chama de qualquer lugar. ml /c /Zd /coff hello.asm Link /SUBSYSTEM:CONSOLE hello.obj Com o GCC e GAS fica assim: Original em C: 1 #include <stdio.h> 2 int main(){ 3 puts("hello world\n"); 4 return 0; 5 } Em assembly: 1 #i686-w64-mingw32-gcc -S -masm=intel -mpush-args -mno-accumulate-outgoing-args -mno-stack-arg-probe main.c 2 #i686-w64-mingw32-gcc main.s -o main.exe 3 .file "main.c" 4 .intel_syntax noprefix 5 .def ___main; .scl 2; .type 32; .endef 6 .section .rdata,"dr" 7 LC0: 8 .ascii "hello world\12\0" 9 .text 10 .globl _main 11 .def _main; .scl 2; .type 32; .endef 12 _main: 13 lea ecx, [esp+4] 14 and esp, -16 15 push DWORD PTR [ecx-4] 16 push ebp 17 mov ebp, esp 18 push ecx 19 sub esp, 4 20 call ___main 21 sub esp, 12 22 push OFFSET FLAT:LC0 23 call _puts 24 add esp, 16 25 mov eax, 0 26 mov ecx, DWORD PTR [ebp-4] 27 leave 28 lea esp, [ecx-4] 29 ret 30 .ident "GCC: (GNU) 6.4.0" 31 .def _puts; .scl 2; .type 32; .endef gzn@note:~/Downloads/crackme_level1$ file main.exe main.exe: PE32 executable (console) Intel 80386, for MS Windows Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Janeiro 16, 2018 em 11:41 Compartilhar Postado Janeiro 16, 2018 em 11:41 21 horas atrás, gzn disse: Perdão @fredericopissarra, quando disse gerado quis dizer compilado. O cygwin tem um sistema de empacotamento particular e algumas coisas tem patches deles, e se não me engano um tempo atrás o mingw deles tinha algumas diferenças em relação ao oficial. Sobre a sintaxe e as instruções que você citou que foram renomeadas isso não muda com a diretiva: .intel_syntax noprefix não? Os mnemonicos pode até ser, mas a sintaxe não. Eu li aqui que o NASM não usa a sintaxe oficial da intel, o MASM sim. Yep, pode-se usar a notação intel no GAS, mas não é o padrão. Sim, o NASM tem algumas pouquíssimas diferenças. Por exemplo, a pilha do fp87 não é nomeada st(n); mas st0, st1, ... st7. No mais, as instruções são as mesmas dos mnemônicos Intel. PS: MingW também tem um sistema de empacotamento, no caso do Windows, via MinGW32-setup.exe... mas eu recomento o uso do TDM-GCC para o ambiente Win64. Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Janeiro 16, 2018 em 11:51 Compartilhar Postado Janeiro 16, 2018 em 11:51 Um artigo que escrevi em 2016 sobre uso de assembly para desenvolvimento de aplicações completas, para Windows:"A futilidade de programar para Windows diretamente em assembly" Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.