FORUM DARKERS

Tecnologia & Informática => Programação => ASM => Topic started by: Alucard on 02 de November , 2007, 01:52:05 PM

Title: [Dúvida] Loop nasm
Post by: Alucard on 02 de November , 2007, 01:52:05 PM
Olá, tentando fazer um loop em assembly, mas ele não tá saindo do loop, loop infinito.

;Escreve uma string
%macro print 2
mov eax,4            ; The system call for write (sys_write) system call para
mov ebx,1            ; File descriptor 1 - standard output
mov ecx,%1            ; Put the offset of hello in ecx
mov edx,%2            ; helloLen is a constant, so we don't need to say
                      ; mov edx,[helloLen] to get it's actual value
int 80h              ; Call the kernel
%endmacro

;Finaliza a aplicação
%macro exit 1
mov eax,1            ; The system call for exit (sys_exit)
mov ebx,%1            ; Exit with return code of 0 (no error)
int 80h
%endmacro

section .data       ; Declaração das variáveis
string: db "Olá Mundo Assembly", 10
lenString: equ $-string

section .text
global _start       ; Pula para o inicio do programa
     
_start:       ; Inicio do Programa
xor eax, eax

.while ; Enquanto for menor que 10
cmp eax, 10
jne .faca
.faca
print string, lenString
inc eax
jmp .while

je .fimEnquanto
.fimEnquanto
exit 0


Outra dúvida com faço para concatenar uma string, em assembly.

str = str + " SobreNome";
Title: Re: [Dúvida] Loop nasm
Post by: caesar2k on 02 de November , 2007, 09:38:45 PM
hehe NASM pe bem diferente de VB. pra concatenar, você precisa usar uma função que chama lstrcat.
eu sou meio 'contra' o uso de macros desnecessários, ainda mais os .while, .if, etc.
você pode fazer um loop com
mov ecx, 10
@loop:
cmp eax, 10
jz @exitloop ; jmp se for zero
; código
dec ecx
jmp near @loop ; só pra salvar alguns bytes
@exitloop:
; fora do loop

e tem o mnemônico LOOPZ / LOOPNZ também
mov ecx, 10
@loop:
test eax,eax ; só fazendo um check se eax é zero
; resto do código
loopnz @loop ; decrementa ECX e só continua o loop se eax != 0

O ECX é o registro de "counter". Ele é normalmente o utilizado pra contar, tanto crescente, quanto descrecente, dentro de um loop! Decida por utilizar ele no caso de uma contagem ou de um loop crescente ou decrescente.
Title: Re: [Dúvida] Loop nasm
Post by: Alucard on 03 de November , 2007, 01:01:55 AM
Muito obrigado. Mas consegui arruma uma solução. O código meu tava no loop inifinito porque a ordem do codigo tava errada.

;Escreve uma string

%macro print 2
push eax ; Coloco eax na pilha
push ebx ; Coloco ebx na pilha
push ecx ; Coloco ecx na pilha
push edx ; Coloco edx na pilha

mov eax,4            ; The system call for write (sys_write) system call para
mov ebx,1            ; File descriptor 1 - standard output
mov ecx,%1            ; Put the offset of hello in ecx
mov edx,%2            ; helloLen is a constant, so we don't need to say
                      ; mov edx,[helloLen] to get it's actual value
int 80h              ; Call the kernel
; FIFO (Frist In Frist Out)
pop edx ; Retiro edx da pilha
pop ecx ; Retiro ecd da pilha
pop ebx ; Retiro ebx da pilha
pop eax ; Retiro eax da pilha
%endmacro

;Finaliza a aplicação

%macro exit 1
push eax ; Coloca eax na pilha
push ebx ; Coloco ebx na pilha

mov eax,1            ; The system call for exit (sys_exit)
mov ebx,%1            ; Exit with return code of 0 (no error)
int 80h
%endmacro

section .bss ; Inicialização das variaveis

section .data       ; Declaração das variáveis
string: db "Numero: "
lenString: equ $-string

newLine: db "",10
lenNewLine: equ $-newLine

numeroUm: dw 48

section .text
global _start       ; Pula para o inicio do programa
     
_start:       ; Inicio do Programa
xor ecx, ecx ; Limpo o registrador ecx
xor eax, eax ; Limpo o registrador eax

mov ecx, 0

.while ; Enquanto for diferente de 10
cmp ecx, 10 ; Comparo ecx com 10
jne .do ; Se for diferente o loop continua
je .fimWhile ; Se for igual o loop  deve parar

.do ; corpo do while

print string, lenString ; imprimo na tela a string
print numeroUm, 1 ; imprimo na tela o numero
print newLine, lenNewLine ; salto uma linha

inc ecx ; incremento ecx
inc eax ; incremento eax
inc word[numeroUm] ; adiciono um na variavel numeroUm

jmp .while ; pulo para o inicio do loop

.fimWhile ; Sai do loop
exit 0 ; Finalizo o programa


Esse codigo funciona da forma que eu queria. xD

Agora para concatenar strings vou dar uma olhada na syscall strcat, e muito obriado caesar2k.