4
Cesáreo Fernández Martínez
Álvaro Sánchez Miralles
Tareas que realiza el programa ensamblador
• Traduce el fuente .a66 a código máquina .obj
– mov Rx, Ry
F0
Código de
instrucción
Escribir
programa en
el editor
x y
Número de
GPR
Fichero *.a66
– mov reg, #dato
E6
reg
dato
Ensamblador
Código de
instrucción
Número de
SFR
Número de
16 bits
Códigomáquina Librerías
.obj
Fichero *.obj
• Resuelve los valores de las etiquetas
– Lleva un contador direcciones en memoria de las
instrucciones. La etiqueta toma el valor de la
dirección de memoria de la instrucción asociada
Enlazar
Código máquina
Fichero *.
Ejecutar
Título Presentación - 2
1
Ejemplo de ensamblador
• Las etiquetas facilitan la programación en ASS
Etiquetas (op)
bucle:
MOV
MOV
MOVMOV
CMP
JMPR
ADD
ADD
JMPS
R0,#0
0xfa00,R0
R0,#1
R1,#1
R0,#5
cc_sgt,fin
0xfa00,R1
R0,#1
bucle
;
;
;
;
;
;
;
r0 (i)
auxiliar
if i>N
then goto ´fin’
j += 1
i += 1
=
jmpr cc_uc,
fin:
Instrucción
Operandos
Comentarios (opcional)
Título Presentación - 3
Números con y sin signo
• Un número negativo es el que sumado a el mismo positivo da
como resultado 0. ¿Cómo hacerlo?
– Ejemplo en 16 bits:0xFFFF + 0x0001 = 0x0000 (ya que el resultado
no cabe en 16 bits)
Número +
Número -
0x0001 (1)
0xFFFF (-1)
0x0002 (2)
0xFFFE (-2)
0x0003 (3)
0xFFFD (-3)
– Ejemplo en 8 bits: 0xFF + 0x01 = 0x00 (ya que el resultado no cabe
en 8 bits)
Título Presentación - 4
2
Números con y sin signo
• Aritmética en “Coma fija complemento a 2”
– Números positivos: bit más significativo (bit 15) a 0.
–Números negativos: bit más significativo (bit 15) a 1.
número _ negativo = 2 número _ de _ bits − número _ positivo
0 xFFFE = 216 − 0 x0002
• Overflow (Flag V del registro PSW)
– Cuando operando dos números positivos se obtiene un número
negativo
0x7FFF + 0x0001 = 0x8000 (“Overflow”; V = 1)
0x7FFE + 0x0001 = 0x7FFF (V = 0)
• Carry (Flag C del registro PSW)
– Cuando operando dos números no cabe elresultado en 16 bits
0x8000 + 0x8000 = 0x0000 (“Carry”; C = 1)
0x8000 + 0x7FFF = 0xFFFF (C = 0)
Título Presentación - 5
Números con y sin signo
• ¿Cómo se calcula un número negativo?
– En decimal se aplica la formula ¿cual es el negativo de 2 en 8 bits?
número _ negativo = 2 número _ de _ bits − número _ positivo
254 = 28 − 2
– En binario o hexadecimal (0000 0010 B)
• Se hace el complemento a 1 delnúmero (1111 1101 B)
• Se le suma uno (1111 1110 B)
– El número negativo de 2 en 8 bits es el 254 ó 0xFE ó 11111110B.
• Como el micro sólo entiende de 0's y 1's cuando hay un
número en la memoria (por ejemplo 1111 1110) ¿Qué
significa?
– Si se interpreta con signo es el número negativo de 2 ó -2
– Si se interpreta sin signo es el número 254
– Depende del programador y de las instrucciones que useel que le da
una interpretación u otra.
Título Presentación - 6
3
Instrucción MOV.
• Directo a registro
– MOV
r0,r1
; R0 <- R1
r0,#3
; R0 <- 3 (no olvidar # !)
• Inmediato
– MOV
• directo a memoria
– MOV
; R0 <- Mem[fa00 H]
r0,0fa00H
• Indirecto (“normal”, post-incremento, pre-decremento)
– MOV
r0,[r1]
; R0 <- Mem[R1] (R1 Puntero)
– MOV
– MOV
r0,[r1+]
r0,[-r1]
; R0 <- Mem[R1], R1<- R1 + 2
; R1 <- R1 - 2, R0 <- Mem[R1]
– MOV
r0,[r1+#4]
; R0 <- Mem[R1+#4]
• A nivel de byte
– MOVB
rl0,#3
; R0 <- 3
– MOVB
rh0,[r1+]
; R0 <- Mem[R1], R1 <- R1 + 1
Título Presentación - 7
Mov con extensión de signo.
• Extensión de signo
– MOVBZ
• Carga el byte en parte baja, extiende (a los 16 bits) con ceros
MOVBZ
MOVBZ
R0,#0xFF ; r0 <- 0x00FF
R0,#-1
; r0 <- 255 no respeta el signo– MOVBS
• Carga el byte en parte baja, extiende (a los 16 bits) con bit de
signo
MOVBS
MOVBS
R0,#0xFF ; r0 <- 0xFFFF
R0,#-1
; r0 <- -1 respeta el signo
8 bits con
signo
8 bits sin
signo
16 sin
extender signo
16 bits extendiendo signo
0xFF
-1
255
255 (0x00FF)
-1 (0xFFFF)
0x80
-128
128
128 (0x0080)
-128 (0xFF80)
Título Presentación - 8
4
Programando con etiquetas (para datos)...
Regístrate para leer el documento completo.