Foros del Web » Programación para mayores de 30 ;) » Programación General »

Assembler, ejercicio práctico.

Estas en el tema de Assembler, ejercicio práctico. en el foro de Programación General en Foros del Web. Hola que tal? Tengo que hacer un trabajo práctico para la facultad, y resulta que me he trabado en un ejercicio, y a pesar de ...
  #1 (permalink)  
Antiguo 22/06/2013, 00:38
 
Fecha de Ingreso: abril-2008
Ubicación: Córdoba
Mensajes: 103
Antigüedad: 16 años, 7 meses
Puntos: 4
Assembler, ejercicio práctico.

Hola que tal?

Tengo que hacer un trabajo práctico para la facultad, y resulta que me he trabado en un ejercicio, y a pesar de que busque por internet, tengo una duda que no logro resolver.

El enunciado dice:

Dada una tabla de datos contenida a partir de la dirección de memoria DS:1000 y cuyo final viene dado por un caracter “$” (Hex. 24) elimine todos los espacios en blanco (HEX 20) que hay en el comienzo de la lista desplazando hacia arriba tantos lugares como espacios blancos haya eliminado.

Ejemplo.


Antes de ejecución:

Dirección de memoria - Valor cargado

1000 20

1001 20

1002 20

1003 20

1004 41

1005 42

1006 5F

1007 20

1008 34

1009 24

100A …

Luego de la ejecución:

Dirección de memoria - Valor cargado

1000 41

1001 42

1002 5F

1003 20 (Este valor no será borrado porque no está al principio de la lista)

1004 34

1005 24

Mi duda es: Yo se como hacer para ir leyendo las direcciones de memorias. También se como realizar comparaciones con CMP op1, op2. Luego sé como hacer para saltar a una dirección de memoria específica en caso de que la comparación sea correcta (JZ). Ahora, mi duda es: Como podría hacer para que, en el ejemplo dado, el valor de la dirección de memoria 1004 se mueva a la dirección de memoria 1000, y a su vez todas las direcciones de memorias superiores a la 1004 se retrasen?

Espero haberme explicado, a ver si me pueden orientar un poco.

Saludos!
  #2 (permalink)  
Antiguo 22/06/2013, 08:59
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 10 meses
Puntos: 57
Respuesta: Assembler, ejercicio práctico.

A ver, hace mucho que no uso ensamblador.

Primero, DS es solo un segmento. Necesitas tambien utilizar un desplazamiento (u offset) junto con el segmento. Para esto generalmente se utilizan los registros SI, DI, AX, BX, etc.
Podrias utilizar la instruccion MOVSB para mover la cadena. Necesitarias leer en SI la direccion de origen (donde empieza la cadena que quieres mover) y en DI la direccion de destino (hacia donde quieres mover la cadena). Luego en CX necesitas el numero de caracteres que quieres mover y al final utilizar REP MOVSB para hacer el movimiento

http://www.forosdelweb.com/f14/copia...blador-711603/
  #3 (permalink)  
Antiguo 23/06/2013, 03:15
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 5 meses
Puntos: 127
Respuesta: Assembler, ejercicio práctico.

Primero: Desconozco qué compilador usas ni qué sintaxis.

En una primera instancia, los ensambladores de alto nivel como nasm permiten hacer cálculos de tamaño de cadena directamente.

Suponiendo esto en el segmento de datos:

Código Ensamblador:
Ver original
  1. section .data
  2. texto "    aoaisjdoasijdoioasijdoaijoianodisndoi2jogikogikoik",'$'
  3. %strlen textolength texto

En base a eso, la dirección última sería ds:[1000+textolength]

Código Ensamblador:
Ver original
  1. scan:
  2.     .loop:
  3.     mov ecx, texto+ebx
  4.     add ebx, 0x01
  5.     cmp ecx, 0x20 ; espacio
  6.     je balancer.loop
  7.     cmp ecx, eax
  8.     je scan.loop
  9.  
  10. balancer:
  11.     .loop

La idea es dos labels, uno para hacer el escaneo y otro para el balanceo....

Desarrolla la idea.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Etiquetas: ejercicio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:38.