[Dúvida] Loop nasm

Iniciado por Alucard, 02 de Novembro , 2007, 01:52:05 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Alucard

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";

caesar2k

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.

Alucard

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.