Jump to content

O Retorno dos Membros VIP Junte-se ao Clube

Obtenha destaque e desfrute os benefícios exclusivos para VIP.
Clique Aqui

Reporte bugs e nos ajude a melhorar!

Nos ajude a descobrir bugs! Além de melhorar a comunidade.
Reporte aqui!

Conheça a Lotérica e arrisque sua sorte!

Descubra o quão sortudo você pode ser.
Saiba mais
Notícia
  • Junte-se ao Clube de membros VIP!
  • Teste sua sorte em nossa loteria e concorra a uma fortuna de webcoins!
definestate

INLINE ASM X86 / C++ - Sequência de Fibonacci

Recommended Posts

 

Fiz está sequência de fibonacci em Assembly X86 (mais preciso: INLINE ASM x86)

#include <cstdio>

int fib( const int n )
{
	if ( n <= 1 ) return n;

	return fib( n - 1 ) + fib( n - 2 );
}

int main()
{
	for ( auto i = 0; i < 20; ++i )
		printf( "%d\n", fib( i ) );
}
#include <iostream>
char    format[] = "%d\n";
_declspec (naked) int fibonacci(const int n)
{
    __asm
    {
        push ebp
        mov ebp, esp
        sub esp, 4
        push ebx
        push esi
        mov ecx, 30
        mov eax, 0xCCCCCCCC
        cmp DWORD PTR[ebp + 8], 1
        jg loop_1
        mov eax, DWORD PTR [ebp+8]
        jmp loop_2
    loop_1:
        mov eax, DWORD PTR[ebp + 8]
        sub eax, 1
        push eax
        call fibonacci
        add esp, 4
        mov esi, eax
        mov ecx, DWORD PTR[ebp + 8]
        sub ecx, 2
        push ecx
        call fibonacci
        add esp, 4
        add eax, esi
    loop_2:
        pop esi
        pop ebx
        mov esp, ebp
        pop ebp
        ret
    }
}

int main()
{
    _asm
    {
            push ebp
            mov ebp, esp
            sub esp, 4
            push ebx
            mov eax, 0xCCCCCCCC
            mov DWORD PTR[ebp+8], 0
        jmp loop_1
        loop_3:
            mov eax, DWORD PTR [ebp + 8]
            add eax, 1
            mov DWORD PTR[ebp+8], eax
        loop_1:
            cmp DWORD PTR[ebp+8], 20
        je loop_2
            mov eax, DWORD PTR [ebp+8]
            push eax
            call fibonacci
            add esp, 4
            push eax
            push offset format
            call dword ptr [printf]
            add esp, 8
        jmp loop_3
        loop_2:
            pop ebx
            mov esp, ebp
            pop ebp
            leave
            ret
    }
}

 

Edited by definestate
  • Like 2

Share this post


Link to post
Share on other sites

Rapaz... Parabéns viu, lembro do professor de arquitetura ter pedido pra fazer isso em uma lista de MIPS 3 semestres atrás, que aliás joguei fora uns dias atrás auehauheu (:1472_itachi_facepalm:), se eu estiver enganado depois posto ela aqui. Lembro que tinha uma questão de recursão que eu não consegui fazer de jeito nenhum, só lembro que tinha dois argumentos a função...
 

Peguei o livro do Kip Irvine pra aprender MASM semestre passado, mas o cara depende tanto das próprias bibliotecas que ele criou que eu preferi pular pra NASM/FASM e atualmente o que mais to achando interessante é ARM, tem muito campo pra explorar e brincar com o Raspberry Pi, mas achar tempo tá foda.

E, só pra não perder o costume de ser cuzão: Tem certeza que isso aí é MASM? Isso aí que tu tá fazendo, pra mim, é só inline assembler, e a própria Microsoft na documentação os tratam como coisas diferentes: "The Microsoft Macro Assembler (MASM) provides several advantages over inline assembly", "The inline assembler is built into the compiler, so you don't need a separate assembler such as the Microsoft Macro Assembler (MASM). ".

 

Abraço.

 

--EDIT--

 

Achei a lista e minhas respostas no portal aqui, e no caso me enganei, fibonacci ele pediu iterativo e fatorial pediu com recursão:

 

#Fibonnacci com laço
#i = s0

main:
	li		$a0, 14
    jal		fibonacci
    move	$s0, $v0 	#s0 = fibonacci(a0)
    j end
    fibonacci:
    	subi 	$sp, $sp, 20
        sw 		$t0, 0($sp)
        sw 		$s0, 4($sp)
        sw 		$s1, 8($sp)
        sw 		$s2, 12($sp)
        sw 		$s3, 16($sp)
        subi 	$a0, $a0, 1 #a0 = a0 - 1
        li		$s0, 0 		#i = 0
        li		$s1, 0
        li		$s2, 1
        li		$s3, 0
        for:
        	slt 	$t0, $s0, $a0		#i < a0?
            beq		$t0, $zero, end_fib	#i < a0!
            add		$s3, $s1, $s2		#s3 = s1 + s2
            move 	$s1, $s2			#s1 = s2
            move	$s2, $s3			#s2 = s3
            add		$s0, $s0, 1			#i = i + 1
            j 		for
        end_fib:			#i >= a0!
        move	$v0, $s3	#return s3
        lw		$t0, 0($sp)
        lw		$s0, 4($sp)
        lw		$s1, 8($sp)
        lw		$s2, 12($sp)
        lw		$s3, 16($sp)
        addi	$sp, $sp, 20
        jr $ra
end:

 

#Fatorial recursivo
  
main:
	li	$a0, 3
    jal fat
    j 	end
    fat:
    	subi	$sp, $sp, 8
        sw 		$ra, 0($sp)
        sw 		$a0, 4($sp)
        li 		$t1, 1
        slt 	$t0, $a0, $t1
        beq 	$t0, $zero, L1
        li 		$v0, 1
        addi 	$sp, $sp, 8
        jr 		$ra 
        L1:
          subi 		$a0, $a0, 1
          jal 		fat
          lw 		$ra, 0($sp)
          lw 		$a0, 4($sp)
          addi 		$sp, $sp, 8
          mul 		$v0, $a0, $v0
          jr 		$ra 
end:

 

Edited by TheSkytalos
Código adicionado
  • Like 1

"May you be in heaven half an hour before the Devil knows you're dead"

Share this post


Link to post
Share on other sites

Eu acabei me referindo errado na hora, eu estava usando o vs para masm mesmo, ai é inline asm, ai dps q postei acabei me ligando mas fiquei com preguiça de editar.

 

O único problema que vejo é usar inline asm x64, é um saco.

 

Os algoritmos de Fibonacci é muito bom, pra praticar, parabéns também. 

 

O livro que comecei a ler trata muita coisa: Intel Assembly Language, é do início ao fim. Muito bom mesmo. Só é todo em inglês, mas eu recomendo bastante.

 

No início tive bastante problemas com inline asm, mudava algumas coisas de quando tu olha em um debugger tipo o x64dbg, mas li um pouco e ajudou. E como to estudando RE inline asm  masm ajudou muito, logo já estou partindo para x64. Valeu.

Share this post


Link to post
Share on other sites

Muito bom mano, acho massa ver que tem gente que se interessa por Assembly hoje em dia e quer procurar aprender sobre o mesmo, porque concordamos, o conhecimento em Assembly dificilmente servirá pro mercado da nossa área, poucas exceções.

Qualquer dia quando tiver um tempinho eu posto um código de um programinha que fiz no começo do ano pra faculdade, o programa era basicamente leitura, escrita (.txt) e cifra, tem bastante coisa interessante lá também.

Share this post


Link to post
Share on other sites
Em 19/10/2019 em 16:12, definestate disse:

Eu acabei me referindo errado na hora, eu estava usando o vs para masm mesmo, ai é inline asm, ai dps q postei acabei me ligando mas fiquei com preguiça de editar.

 

O único problema que vejo é usar inline asm x64, é um saco.

 

Os algoritmos de Fibonacci é muito bom, pra praticar, parabéns também. 

 

O livro que comecei a ler trata muita coisa: Intel Assembly Language, é do início ao fim. Muito bom mesmo. Só é todo em inglês, mas eu recomendo bastante.

 

No início tive bastante problemas com inline asm, mudava algumas coisas de quando tu olha em um debugger tipo o x64dbg, mas li um pouco e ajudou. E como to estudando RE inline asm  masm ajudou muito, logo já estou partindo para x64. Valeu.

Vou checar se tem esse livro na biblioteca da faculdade... A sintaxe desse livro é Intel ou AT&T?

Sobre ASM x86_64, nunca vi nem comi... E o próprio x86 só risquei a pontinha, cheguei até C Calling Convention, que é o necessário pra fazer uns hooks aí, o resto eu deduzo do que aprendi com os RISCs da vida... Sobre esse monte de PTR DWORD e não sei o que mais, lembro que tinha a ver com o tamanho dos valores/ponteiros que está movendo, mas nem sei se é isso mesmo.

 

Eu como aprendi a programar assembly em RISC, com a sintaxe "DST, SRC, SRC", x86 com aquela sintaxe da AT&T me parece um pesadelo - que o pessoal do Linux adora usar com o GNU Assembler -, mas tô bem a fim de aprender x86 mais a fundo (desde que com a sintaxe Intel com foco em Windows)....

 

Valeu pela dica do livro!


"May you be in heaven half an hour before the Devil knows you're dead"

Share this post


Link to post
Share on other sites
Em 19/10/2019 em 20:26, luis3232 disse:

porque concordamos, o conhecimento em Assembly dificilmente servirá pro mercado da nossa área, poucas exceções.

 

Infelizmente, estás correto, e não só com Assembly, mas o pessoal aqui do curso de CIÊNCIA DA COMPUTAÇÃO já torce o nariz pra qualquer coisa que seja menos "babá" do que Python ou Java, por exemplo.

 

Mercado então, nem se fala... É o que um professor meu disse uma vez, Photoshop, Office, etc já existiam a muitos anos atrás, quando os processadores eram super lentos, sem pipeline, paralelismo e o escambau, daí esses programas que sim, evoluíram, mas convenhamos que nem tanto, ainda rodam lentos em muito computador, justamente por esse aumento exacerbado de nível nas linguagens de programação.

Quando assunto é Brasil então, piora tudo, uma vez que somos consumidores de tecnologia e não produtores, daí os empregos ficam ai quase que em sua totalidade confinados em "Desenvolvedor Web NodeJS com especialidade em "qualquerFrameworkNovaLançadaA2Meses.JS".

 

É triste, tô com um trabalho de IA e outro de IHC que envolvem jogos, a vontade é SDL2, mas sei que aos olhos do mercado (visando Django2 por exemplo), é mais interessante fazer esses trabalhos em PyGame, que é infinitamente mais lento.

 

Minha visão do mercado é essa, de um estudante de CC, mesmo preferindo mil vezes ASM/C/C++ no máximo C#.NET, fico me forçando a aprender essas bobagem de Web pq pelo o que vejo é onde que os empregos estão...
 

Em 19/10/2019 em 20:26, luis3232 disse:

Qualquer dia quando tiver um tempinho eu posto um código de um programinha que fiz no começo do ano pra faculdade, o programa era basicamente leitura, escrita (.txt) e cifra, tem bastante coisa interessante lá também.

 

Se achar, posta aí pra gente, o problema desses programas quando se trata de chamadas de sistema diversas em ASM, é que somos obrigados a fazer chamadas de funções escritas provavelmente em C... Que na minha opinião meio que estraga o rolê, mas fazer o quê, não tem outro jeito né.

 

Algo me diz que eu não posso postar duas respostas uma embaixo da outra.... Seria isso mesmo? :969254347_ThinkingEmojiFreeDownloadIOSEmojis:


"May you be in heaven half an hour before the Devil knows you're dead"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...