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