listas en assembler ciclo loop emu8086 [facil]

Iniciado por ErielSinh, Diciembre 09, 2020, 09:44:47 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 09, 2020, 09:44:47 PM Ultima modificación: Diciembre 10, 2020, 01:16:24 AM por ErielSinh
El siguiente programa es un ejemplo sencillo de como funciona el ciclo de repeticion equivalente al for
Programa que imprime una lista y suma todos sus componentes
Código: php

org 100h;iniciamos en la direccion 100h de la memoria
mov bx,0 ; utilizaremos un contador en bx para movernos dentro de la lista, este inicia en cero
mov cx,5; en cx se declara el numero de repeticiones del loop nuestra lista tendra un tamaño de 5 asi que con 5 repeticiones  basta
repetir:  ;   aqui empezara el loop, tenemos nuestro loop con la etiqueta repetir:
; aqui debemos poner todas las acciones que queremos que se repitan
  mov al,lista[bx];  copiamos el contenido almacenado en lista[posicion] en al
  add suma, al ; sumamos a la variable suma el valor contenido en al, es como suma=suma+al
  add bx,1;  movemos nuestra posicion de la lista para la siguiente repeticion
loop repetir ; al llegar aqui saltara a la etiqueta repetir:
ret ; abajo de ret declararemos todos nuestras variables

lista db 4,3,5,78,1   ; declaramos nuestra lista en data byte con los valores 4,3,5,78,1
suma db 0; inicializamos una variable suma para almacenar el total de la suma de la lista

Ejecutamos nuestro codigo en emu8086, viendo las variables


Ahora veremos otro ejemplo con listas
Programa para determinar el mayor de una lista
Código: php

org 100h
mov bx,0
mov cx,n

repeticion:
   mov ax,lista[bx]
   cmp ax,mayor
   jg cambiar
   jmp continuar
   cambiar:
     mov mayor,ax   
   
   continuar:
   add suma,ax
   add bx,2     
   
loop repeticion
ret
n dw 5 
lista dw 4,3,5,7,1
suma dw 0   
mayor dw 0

Ejecutamos el codigo en emu8086


a modo de ejercicio intenten sacar el menor de la lista



Genial aporte @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Como pequeñas recomendaciones, para no acceder constantemente a la memoria, lo que podría usar es un registro y a su vez, almacenar el resultado en memoria; como nimiedad mía, lo que puede hacer es que en vez (si su ensamblador le permite) de ajustar el registro CX con el valor inmediato, disponer de una constante (es lo mismo, pero no en código) o si prefiere (aunque también depende de lo que haga el programa y sus necesidades), es usar una variable que especifique el número de repeticiones; y por último, usar INC para sumar un solo número y gastar menos bytes.

Aquí le dejo un ejemplo más o menos de lo que dije anteriormente:
Código: asm
; Programa escrito en TASM para sumar todos los números de un arreglo.

MODEL Tiny
DATASEG
lista DB  1,2,3,4 ; es igual a 0A (10, en decimal)
suma  DB  0
NREP  EQU 4

CODESEG
ORG 100h
start:
LEA SI, lista
LEA DI, suma
MOV CX, nrep
XOR DL, DL

repetir:
MOV AL, [SI]
ADD DL, AL
INC SI

LOOP repetir
MOV [DI], DL

END start


~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

gracias por las recomendaciones, estoy haciendo un curso de assembler para luego empezar con cracking quise compartir algunos ejercicios que habia resuelto para practicar algunos ejercicios

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Excelente que tenga deseos por adentrarse en este hermoso mundo. Siga así y no le tiemble el pulso a la hora de seguir compartiendo estos grandiosos aportes, que de seguro, ayudarán a muchos.

Suerte.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF