bornman Posted January 12, 2018 at 10:21 PM Share Posted January 12, 2018 at 10:21 PM 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 to comment Share on other sites More sharing options...
Pimptech Posted January 13, 2018 at 04:16 AM Share Posted January 13, 2018 at 04:16 AM 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 to comment Share on other sites More sharing options...
bornman Posted January 13, 2018 at 09:08 PM Author Share Posted January 13, 2018 at 09:08 PM 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 to comment Share on other sites More sharing options...
Pimptech Posted January 14, 2018 at 01:48 AM Share Posted January 14, 2018 at 01:48 AM 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 to comment Share on other sites More sharing options...
bornman Posted January 14, 2018 at 12:30 PM Author Share Posted January 14, 2018 at 12:30 PM 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 to comment Share on other sites More sharing options...
gzn Posted January 14, 2018 at 07:06 PM Share Posted January 14, 2018 at 07:06 PM 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 to comment Share on other sites More sharing options...
fredericopissarra Posted January 15, 2018 at 12:18 PM Share Posted January 15, 2018 at 12:18 PM 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 to comment Share on other sites More sharing options...
bornman Posted January 15, 2018 at 01:22 PM Author Share Posted January 15, 2018 at 01:22 PM 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 to comment Share on other sites More sharing options...
gzn Posted January 15, 2018 at 01:56 PM Share Posted January 15, 2018 at 01:56 PM 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 to comment Share on other sites More sharing options...
Fernando Mercês Posted January 15, 2018 at 06:05 PM Share Posted January 15, 2018 at 06:05 PM Aqui mesmo no fórum tem um Hello, World com MASM. Link to comment Share on other sites More sharing options...
bornman Posted January 15, 2018 at 08:24 PM Author Share Posted January 15, 2018 at 08:24 PM 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 to comment Share on other sites More sharing options...
gzn Posted January 15, 2018 at 11:26 PM Share Posted January 15, 2018 at 11:26 PM 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 to comment Share on other sites More sharing options...
fredericopissarra Posted January 16, 2018 at 11:41 AM Share Posted January 16, 2018 at 11:41 AM 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 to comment Share on other sites More sharing options...
fredericopissarra Posted January 16, 2018 at 11:51 AM Share Posted January 16, 2018 at 11:51 AM 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 to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.