Practico 7 ej 8 OpenFing

Practico 7 ej 8 OpenFing

de Rodrigo Alain De La Vega Rodriguez -
Número de respuestas: 3

Buenas, mi duda esta en como moverse en memoria cuando tenemos un array. Dejo la imagen 1 y 2 de la solución que se dio en OF ya que el profesor hace un INC BX en vez de hacer un ADD BX, 2 y eso me genera dudas.

A menos que se aclare, se sabe que el texto en este caso es un array de caracteres que comienza en la posición DS:[SI]. Esto me lleva a pensar que cada carácter se encuentra en un byte de memoria pero en otras ocasiones resulta que cada carácter esta contenido en una palabra y que ocupa la parte baja de la misma.

La duda es, no se supone que siempre se debe ver como que el carácter esta contenido en una palabra y luego para movernos hacia el otro carácter avanzamos de a dos?



Si no se entiende me dicen y trato de explicarme nuevamente.
Gracias. Saludos,


En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: Practico 7 ej 8 OpenFing

de Gustavo Brown -

Rodrigo,

  Un string en formato ASCIIZ (el usual para representar strings en C) es una secuencia de bytes donde cada byte corresponde a un caracter (ASCII) del string y se termina el mismo con un byte NULL (código ASCII 0).

En este ejemplo se está modelando dos strings ASCIIZ y para acceder a ellos se tiene un "puntero" a la base de cada string (en DI y SI) y luego un índice para cada uno en (en BP y BX).

Como cada caracter ocupa un byte se incrementa el índice en el bucle y se accede mediante [BP+DI] y [BX + SI], o sea usando "base + desplazamiento".

En algunos ejercicios se desea pasar a una subrutina un caracter como parámetro (via el stack). Como el stack se trabaja únicamente a nivel de palabra en esos casos se hace PUSH de una palabra que contiene el caracter y el otro byte que forma la palabra se debe descartar.

Ahora no recuerdo ningún ejemplo donde modelemos un string mediante un arreglo de palabras, si tenes un ejemplo concreto podes pasarlo por aqui para analizarlo.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 7 ej 8 OpenFing

de Rodrigo Alain De La Vega Rodriguez -

Gustavo, buenos días. Gracias por tu respuesta. En el examen de diciembre de 2016 en el problema 1 hay un ejercicio parecido pero este es por recursión.

Entiendo que cuando se pasan los parámetros al stack se asume como palabra y se trabaja con la parte baja de lo que haya en el stack como parámetro pero a la hora de iterar el texto Original, debería hacerlo sumando 1 al desplazamiento o 2?

Si no se entiende avísame y vuelvo a preguntar. Gracias.
Link del examen: 
https://eva.fing.edu.uy/pluginfile.php/44683/mod_folder/content/0/2016/solExAC201612.pdf?forcedownload=1


En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: Practico 7 ej 8 OpenFing

de Gustavo Brown -

Rodrigo,

  Estas confundiendo tipos de datos. Una cosa es un puntero a char y otra cosa es un char.

La rutina del examen que mencionas tiene 2 parámetros de tipo char * (es decir, "puntero a char").

Los punteros en 8086 pueden ser de 2 tipos, near o far. Cuando son near se debe especificar el desplazamiento y está implícito el segmento. Cuando son far se debe especificar tanto desplazamiento como segmento. 

En el ejercicio del examen la letra indica que los strings se encuentran ambos en el segmento ES. Por lo tanto los punteros a utilizar son de tipo near. La rutina entonces recibe un desplazamiento para la variable "original" y un desplazamiento para la variable "buscar". Ambas son palabras de 16 bits.

El string en si está en formato ASCIIZ. Como cada caracter consume 1 byte la compilación de "iterBuscar++" se traduce a incrementar en 1 el desplazamiento de la variable "iterBuscar". Lo mismo ocurre con las variables iterOriginal y original.

Saludos,
  Gustavo