Ir para conteúdo
bornman

Ajuda com assembly

Posts Recomendados

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á.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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. 

Espero ter ajudado. Abraço!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
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. 

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites
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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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).

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

 

Editado por gzn

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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


 

Editado por gzn

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×