¿Cómo poner un valor en dos direcciones de memoria (Lenguaje Ensamblador)?

Buen día,

Estoy iniciando en esto de la programación de microcontrolador/microprocesador con lenguaje ensamblador, haciendo ejercicios me encontré con varios ejemplos en los que tengo una duda sobre qué operación usar, el caso es que tengo que hacer una suma con acarreo de lo que se encuentre en la memoria 80 más lo que hay en la memoria 81 y el resultado ponerlo en la memoria 82 y 83:

(80)
+(81)
------
(82)(83)

Para esto hice un programa que quedó:


LDA ($80) ;Añade lo que hay en la memoria (80) a A
ADC ($81) ;Suma con CARRY lo que hay en la memoria (81)
STA ($82)
STA ($83) ;Guarda en (82) y (83)

NOP
¿está correcto eso ó cómo puedo ponerlos en la mem. 82 y 83?
Y en caso de que quiera sumar lo que se encuentra en la memoria (200) y (201) con lo que hay en la (202) y (203) y el resultado ponerlo en (204), (205) y (206) ¿tendría que usar la operación lógica AND?

(200)(201) *No es multiplicación
+(202)(203)
------------
(204)(205)(206)

Por cierto, estoy utilizando el CodeWarrior para estas programaciones, tengo el microcontrolador MC9S08SE8

Gracias por su ayuda :)
 
Última edición:
No, no es correcto.

La idea en el primer caso es que pongas el resultado en la primera dirección y el acarreo en la segunda, ya que al sumar dos números de ocho bits el resultado puede no caber en ocho bits.

El segundo caso que preguntas es similar, te dejo para que lo pienses un poco más tomando en cuenta lo que te contesté para el primer caso.
 
Última edición:
La idea en el primer caso es que pongas el resultado en la primera dirección y el acarreo en la segunda, ya que al sumar dos números de ocho bits el resultado puede no caber en ocho bits.

En cuanto al primer caso algo así entendí, pero no supe qué comando usar, hace unos momentos releía el Set de Instrucciones del micro, ví varias operaciones que creo que pueden servir, pero no estoy del todo segura, repito: soy nueva en esto del ensamblador, intenté con estos:

LDA ($80) ;Añade lo que hay en la memoria (80) a A
ADC ($81) ;Suma con CARRY lo que hay en la memoria (81)
LSLA
STA ($82)
LSLA
STA ($83)

NOP

LDA ($80) ;Añade lo que hay en la memoria (80) a A
ADC ($81) ;Suma con CARRY lo que hay en la memoria (81)
DAA
NOP

y también veía si se podría usar STHX o STX, pero no comprendo muy bien aun cómo sé si estoy usando el correcto :/
 
Tenes dos casos, que el carry sea cero o sea uno
Para los dos casos, en 82 tenes que poner el resultado de la suma.
Si el carry es cero, en 83 tenes que poner el numero cero, si es uno, el numero uno.

Podes solucionarlo usando instrucciones STA y BCC. Anda leyendo y tratando de entender que instrucciones afectan al carry, cuales son influenciadas por el carry, y cuales no afectan ni son influenciadas por el carry.

Para el segundo caso la idea es que cada numero en dos direcciones es un numero de 16 bits. Pensa como lo resolverias.
 
Podes solucionarlo usando instrucciones STA y BCC.

Para el primero hice esto:
LDA ($80) ;Añade lo que hay en la memoria (80) a A
CLC ;Limpia el Bit de Carry
ADC ($81) ;Suma con CARRY lo que hay en la memoria (81)

STA ($82) ;guarda el resultado en (82)
ADC #$00 ; Se añade cero
STA ($83) ; Se guarda en (83)

NOP

Leí un documento, y veía un ejemplo de suma con carry, y me basé en él, intenté usar BCC pero me decia que el valor estaba fuera del rango

LDA ($80) ;Añade lo que hay en la memoria (80) a A
CLC
ADC ($81) ;Suma con CARRY lo que hay en la memoria (81)
BCC ($82)
STA ($83)

Cuando cambio a BCC ($01) no marca algun error.

Para el segundo caso la idea es que cada numero en dos direcciones es un numero de 16 bits. Pensa como lo resolverias.

Para el segundo hice esto:
LDA ($200) ; Carga A con (200)
ADD ($202) ; Suma con (202)
STA ($204) ; Lo guarda en (204)

LDA ($201) ; Carga A con (201)
ADD ($203) ; Suma con (203)
STA ($205) ; Guarga en (205)

STA ($206) ; Guarda en (206)

NOP

Tengo duda al momento de guardar los resultados, por el hecho de que tengo tres espacios para guardar el resultado, en especial el "STA ($206)" por que practicamente estaría guardando el mismo resultado que tenga en ($205), ¿no?

P.D. nunca había usado Lenguaje ensamblador .-.
 
Tenes que distinguir entre programa y datos. Las instrucciones de salto se refieren a direcciones de programa, no de datos.

El programa en castellano seria asi

Cargar dato 1 en acumulador
Limpiar acarreo
Sumar dato 2 al acumulador
Almacenar acumulador en memoria de resultados 1
Saltar a etiqueta 1 si el acarreo es cero
Cargar uno al acumulador
salto incondicional a etiqueta 2
etiqueta 1:
cargar cero al acumulador
etiqueta 2:
almac. acumulador en mem. resultados 2
FIN
 
Tenes que distinguir entre programa y datos. Las instrucciones de salto se refieren a direcciones de programa, no de datos.

El programa en castellano seria asi

Cargar dato 1 en acumulador
Limpiar acarreo
Sumar dato 2 al acumulador
Almacenar acumulador en memoria de resultados 1
Saltar a etiqueta 1 si el acarreo es cero
Cargar uno al acumulador
salto incondicional a etiqueta 2
etiqueta 1:
cargar cero al acumulador
etiqueta 2:
almac. acumulador en mem. resultados 2
FIN

Sí, ya después chequé bien lo de 'Branch...' que es salto a etiquetas, probé con este codigo:

LDA ($80)
CLC
ADC ($81)
STA ($82)
ADC #$00
BCS CARRY

CARRY:
LDA #$01
STA ($83)
BRA mainLoop
NOP

¿También podría ser algo así?
Y con el código que me explicaste segun entiendo sería:

LDA ($80)
CLC
ADC ($81)
STA ($82)
BCC ncarry
LDA #$01
BBA carry

ncarry: LDA #$00

carry: LDA ($83)
NOP

una pregunta, tengo entendido que cuando se hace la suma con acarreo el resultado será la suma más uno, es decir si tengo 10+11=21 más carry= 22, ¿es correcto o no siempre habrá carry?

Muchas gracias
 
El acarreo cumple dos funciones, ver si hay acarreo proveniente de la suma anterior (si la hubiera) y enviar informacion de acarreo a la suma siguiente (si la hubiera).

Es igual que como aprendimos en la escuela, cuando sumo dos numeros de varios digitos, sumo las unidades y "me llevo" lo que sobra, sumo las decenas tomando lo que "me lleve" de las unidades y si me sobra, me lo llevo para la suma de las centenas, etc.

Por eso al principio limpio el acarreo, porque no se que valor tiene. Despues sumo con acarreo y verifico el valor del acarreo LUEGO de la operacion, esto afecta a lo que escribo en la direccion alta ($83), ya sea cero o uno.

Tenes algun simulador o tarjeta con micro para probar lo que vas haciendo?
 
Hola Olay93

Dices:
si tengo 10+11=21 más carry= 22, ¿es correcto o no siempre habrá carry?
Si el Carry era 1 tu resultado sería correcto, pero si no el resultado sería 21.

Efectivamente al efectuar una suma se puede genera un CARRY.
Se puede generar dependiendo del valor de los operandos.

En el caso del microprocesador MC9S08SE8, el Acumulador “A” solo tiene 8 BIT’s.
Así que si sumas FF(Hex) + 1 Se generará ese CARRY.
No así si sumas FE(Hex) +1, el resultado seria FF(Hex).

Ejemplo:
BIT 76543210 . .. Número De BIT’s
ACU 11111111 + ACU = Acumulador.
CAR 00000001 = CAR = Carry,
Re 1 00000000 . .Re = Resultado.

El Acumulador “A” tendrá como resultado: cero.

El CONDITION CODE REGISTER también tiene 8 BIT’s Llamados así:
BIT 7 6 5 4 3 2 1 0
Nom V 1 1 H I N Z C
V = TWO’S COMPLEMENT OVERFLOW.
1 No Se Usa.
1 No Se Usa.
H = HALF-CARRY (FROM BIT 3).
I = INTERRUPT MASK.
N = NEGATIVE.
Z = ZERO.
C = CARRY.

De tal suerte que como el resultado de esa suma es cero y un CARRY, los BIT’s Z y C en el CCR(Mnemotic) se hacen nivel alto.

Para este caso puedes utilizar las instrucciones:
TPA Transfer CCR to Accumulator Aß (CCR)
Transfiere el contenido del CCR al acumulador A
AND Logical AND A ß (A) & (M) M seria = 00000001(BIN).
Y guardar el contenido del acumulador A en la dirección 83.

En fin, por si no tienes las hojas de datos del MC9S08SE8 te adjunto el .PDF
Analiza el capitulo 7 incisos 7.2 y 7.5.

saludos
a sus ordenes
 

Adjuntos

  • MC9S08SE8RM.pdf
    2.9 MB · Visitas: 2
Hi:

Por lo que entiendo.

Usarás dos carácteres de 8 bits en el cual los dos juntos son 16 bits.

80 y 81 se suman.
82 se guarda el acarreo.
83 se guarda el valor.

Si la suma es muy grande, pues:
80 y 81 se suman.
82 se guarda el acarreo.
83 se guarda el valor de 8 bits y 84 otro valor de 8 bits.
------------------------------------------------------------------

82 = 1 bits de acarreo.
83 = 8 bits.
84 = 8 bits.

¿Se entiende lo que quiero expresar?
 
Esta un poco confuso.

Si se suman dos numeros de ocho bits, no puede haber un resultado que sea mas grande que ocho bits y acarreo.

Si se suman dos numeros de dieciseis bits, el resultado tambien ocupa dieciseis bits y un unico bit de acarreo.

Para cualquier tamaño de suma, el resultado es del mismo tamaño que los sumandos y se necesita nada mas un bit adicional de acarreo.
 
Atrás
Arriba