Universidad Nacional de Ucayali
Universidad Nacional de Ucayali
TRABAJO 01 - SO
Integrantes:
- Alexander Efrain Coral Pinedo
- Leslie Lizeth Pinedo Zumaeta
- Darwin Diaz Paima
- Hernández Gallegos Jesús
Asignatura:
Sistemas Operativos
Docente:
Ing. Msc. Euclides Panduro Padilla
Ciclo.
VII– Grupo A
Pucallpa – Perú
2024
Índice
El Lenguaje Ensamblador...................................................................................................................1
Instrucciones......................................................................................................................................3
CISC (Complex Instruction Set Computing).....................................................................................3
RISC (Reduced Instruction Set Computing).....................................................................................5
Registros.............................................................................................................................................8
Arquitectura Harvard........................................................................................................................12
Arquitectura Von Newman...............................................................................................................14
Arquitectura Harvard Modificado....................................................................................................17
Ciclo De Fetch...................................................................................................................................19
La unidad de control.....................................................................................................................21
Tipos de instrucciones..................................................................................................................22
Ensamblador NASM.........................................................................................................................23
¿Cómo compilar con NASM en Linux?..........................................................................................30
Etapa 1 - Crear un fichero fuente..............................................................................................30
Etapa 2 - Ensamblar el fichero fuente.......................................................................................30
Etapa 3 - Creación del ejecutable|............................................................................................31
Etapa 4: Ejecución del programa..............................................................................................31
¿Cómo compilar con NASM en Windows?...................................................................................31
Etapa 1 - Instalar los programas necesarios..............................................................................32
Etapa 2 - Crear un fichero fuente..............................................................................................32
Etapa 3 - Ensamblar el fichero fuente.......................................................................................32
Etapa 4 - Creación y ejecución del programa...........................................................................33
Bibliografía.......................................................................................................................................33
El Lenguaje Ensamblador
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje
ensamblador al código de máquina del computador objetivo. El ensamblador realiza una
traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias
mnemónicas a las instrucciones y datos de máquina.
Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración
generalmente da lugar a muchas instrucciones de máquina. Muchos sofisticados
ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa,
controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría
de los ensambladores modernos incluyen una facilidad de macro (descrita más abajo), y se
llaman macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se
contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se
utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando
se requiere la manipulación directa de hardware, alto rendimiento, o un uso de recursos
controlado y reducido.
Ventajas:
Desventajas:
Tienen un diseño mucho mayor que la arquitectura RISC, lo cual conlleva más
generación de temperatura, mayor consumo y mayor requisito de espacio físico
Permiten crear procesadores con «espacio» libre para añadir otros circuitos o
reducir sencillamente el encapsulado
Este diseño requiere de menos consumo de energía y generan menos calor que
los procesadores RISC
ARM (RISC):
ADD R3, R4, R5 ; Suma el contenido de los registros R3 y R4, y guarda el resultado
en R5
MIPS (RISC):
; Ejemplo de instrucción ADD (sumar)
ADD $t0, $t1, $t2 ; Suma el contenido de los registros $t1 y $t2, y guarda el
resultado en $t0
SUB $s0, $s1, $s2 ; Resta el contenido de los registros $s1 y $s2, y guarda el
resultado en $s0
MULT $a0, $a1 ; Multiplica el contenido de los registros $a0 y $a1, y guarda el
resultado en un registro de 64 bits
Registros
AX (acumulador).
BX (registro base).
CX (registro contador).
DX (registro de datos).
F (registro de banderas).
El registro AX se usa para almacenar resultados, lectura o escritura desde o hacia los
puertos. El BX sirve como apuntador base o índice. El CX se utiliza en operaciones de
iteración, como un contador que automáticamente se incrementa o decrementa de acuerdo
con el tipo de instrucción usada. El DX se usa como puente para el acceso de datos.
El registro BP (base pointer) se usa para manipular la pila sin afectar al registro de
segmentos SS. Es útil cuando se usa interfaz entre lenguajes de alto nivel y el ensamblador.
Puesto que dicha interfaz se basa en el concepto de la pila BP, nos permite acceder
parámetros pasados sin alterar el registro de segmento SS. Los registros SI y DI son útiles
para manejar bloques de cadenas en memoria, siendo el primero el índice fuente y el
segundo el índice destino. En otras palabras, SI representa la dirección donde se encuentra
la cadena y DI la dirección donde será copiada.
El registro SP apunta a un área específica de memoria que sirve para almacenar datos bajo
la estructura LIFO (último en entrar, primero en salir), conocida como pila (stack) El
registro IP (instruction pointer) apunta a la siguiente instrucción que será ejecutada en
memoria.
Interrupts DI = desactivadas
EI = activadas
Sign PL = positivo
NG = negativo
Zero NZ = no es cero
ZR = sí lo es
Aquí hay una descripción general de los registros comunes en diferentes arquitecturas:
x86 (CISC):
1. Registros de propósito general:
EAX, EBX, ECX, EDX
Son utilizados para almacenar datos generales, direcciones de memoria,
resultados de operaciones aritméticas, etc.
2. Registros de segmento:
CS (Código), DS (Datos), SS (Stack), ES (Extra)
Controlan el acceso a diferentes segmentos de memoria.
3. Registros de índice:
ESI (Source Index), EDI (Destination Index)
A menudo se utilizan en operaciones de cadenas y transferencias de datos.
4. Registro de apuntador de pila:
ESP (Stack Pointer)
Indica la posición actual en la pila de llamadas.
5. Registro de puntero de base:
EBP (Base Pointer)
Se utiliza para acceder a parámetros y variables locales en funciones.
6. Registro de contador de instrucciones:
EIP (Instruction Pointer)
Contiene la dirección de la próxima instrucción a ejecutar.
ARM (RISC):
1. Registros de propósito general:
R0 a R15
Se utilizan para almacenar datos y resultados de operaciones.
2. Registros de estado:
CPSR (Current Program Status Register)
Almacena el estado actual del procesador, incluyendo el modo de operación
y las banderas de condición.
3. Registros de apuntador de pila:
SP (Stack Pointer)
Indica la posición actual en la pila de llamadas.
4. Registros de enlace:
LR (Link Register)
Almacena la dirección de retorno después de una llamada a una función.
MIPS (RISC):
1. Registros de propósito general:
$0 a $31
Utilizados para almacenar datos y resultados de operaciones.
2. Registro de apuntador de pila:
$sp (Stack Pointer)
Indica la posición actual en la pila de llamadas.
3. Registros de retorno:
$ra (Return Address)
Almacena la dirección de retorno después de una llamada a una función.
Arquitectura Harvard
Ciclo De Fetch
El ‘’Ciclo de Fetch’’ es una parte fundamentar de la Arquitectura de una computadora
moderna, un ciclo de instrucción, que también es llamado como ciclo de ‘’fetch-and-
execute’’ o ‘’ciclo de ‘’Fetch-decode-execute’’ en inglés. El ‘’Ciclo de Fetch’’ es el periodo
de tiempo que tarda la unidad central del proceso (CPU) en ejecutar una instrucción de
lenguaje máquina. Un Ciclo de Instrucción o Ciclo de Fetch está formado por uno o más
ciclos máquina, para que cualquier sistema de proceso de datos basado en microprocesador
(una computadora) o microcontrolador (un reproductor de MP3) para que pueda cumplir
con una tarea debe de buscar cada instrucción en la memoria principal y luego ejecutarla.
Ejecutar la instrucción
o A partir del registro de instrucción, los datos que forman la instrucción son
decodificados por la unidad de control. Ésta interpreta la información como
una secuencia de señales de control que son enviadas a las unidades
funcionales relevantes de la CPU para realizar la operación requerida por la
instrucción poder terminarla y seguir así.
Almacenar o guardar resultados
o El resultado generado por la operación es almacenado en la memoria
principal o enviado a un dispositivo de salida dependiendo de la instrucción.
Basándose en los resultados de la operación, el contador de programa se
incrementa para apuntar a la siguiente instrucción o se actualiza con una
dirección diferente donde la próxima instrucción será recogida.
Estas 4 sub-etapas ocurren en todos los procesadores sea cual sea su utilidad, arquitectura y
compatibilidad binaria o lo que llamamos ISA. Por lo que es aplicable a prácticamente
cualquier modelo que os podáis encontrar en el mercado. Eso sí, en muchos casos variarán las
tecnologías utilizadas u otros componentes que entran a formar parte de este proceso para
agilizar trabajos mucho más específicos.
La unidad de control
La unidad de control es la pieza más compleja que existe en un procesador y sus tareas son las
siguientes que se detalla aquí debajo. Como en todos los casos, se trata de un conjunto de
mínimos, que son esenciales:
Se encarga de coordinar el movimiento y el orden en que de los datos que se mueven
dentro y fuera del procesador, así de las diferentes subunidades que se encargan de
ello.
En general se considera que las unidades de la etapa de captación o Fetch forman parte
del hardware que llamamos unidad de control y dicho hardware es llamado también el
Front-End de un procesador.
Interpreta las instrucciones y las envía a las diferentes unidades de ejecución a las que
está conectado.
Está comunicado a las diferentes ALUs y unidades de ejecución del procesador que
actúan
La unidad de control lo que hace es descodificar las instrucciones y esto lo hace porque cada
instrucción en realidad no deja de ser una especie de oración en donde primero va el verbo y
luego el objeto directo u objeto sobre el que se hace la acción. El sujeto se acaba eliminando
en este lenguaje interno de los ordenadores por el hecho que se sobrentiende que es el propio
ordenador el que lo ejecuta, así pues, cada cantidad de bits es una oración donde los primeros
1 y 0 corresponden a la acción y los que vienen a continuación es el dato o la localización del
dato que se quiere manipular.
Tipos de instrucciones
Las instrucciones que intervienen durante las fases del ciclo se pueden clasificarse en:
Ensamblador NASM
Introducción
Aquí veremos los fundamentos del ensamblador NASM, su sintaxis, estructuras de control,
manipulación de datos, acceso a memoria y otros aspectos clave que lo convierten en una
herramienta esencial para programadores de sistemas y desarrolladores de software.
Historia y Desarrollo
NASM fue creado por Simon Tatham y Julian Hall en 1996 como un proyecto de código
abierto. Desde entonces, ha experimentado múltiples versiones y revisiones, convirtiéndose
en una de las opciones más confiables y poderosas para la programación en ensamblador en
plataformas x86 y x86-64. NASM se caracteriza por su portabilidad, rendimiento y su
amplio conjunto de características que lo hacen adecuado para una variedad de
aplicaciones, desde la programación de sistemas operativos hasta la optimización de código
de bajo nivel.
Características Principales
NASM ofrece una serie de características que lo distinguen como una herramienta poderosa
para programadores de ensamblador:
1. Sintaxis Clara y Flexible: NASM utiliza una sintaxis clara y flexible que facilita la
escritura y comprensión del código ensamblador. Su sintaxis está inspirada en la
convención Intel, lo que la hace familiar para muchos programadores.
3. Amplia Documentación: NASM cuenta con una extensa documentación que cubre
todos los aspectos del ensamblador, incluyendo guías de referencia, tutoriales y ejemplos de
código.
5. Soporte para Macros: NASM soporta macros, lo que permite la creación de código
modular y reutilizable. Las macros facilitan la escritura de código más legible y mantenible.
Un programa NASM típico consta de varias secciones, cada una con un propósito
específico:
1. Sección de Datos: En esta sección se definen las variables y constantes utilizadas por el
programa.
2. Sección de Código: Aquí se encuentra el código ensamblador real, que consiste en
instrucciones y directivas NASM.
3. Sección de Texto: Esta sección puede contener cadenas de texto y datos similares
utilizados por el programa.
4. Sección de BSS (Block Started by Symbol): Esta sección se utiliza para reservar
espacio para variables no inicializadas.
Sintaxis Básica
Un ejemplo de código NASM básico que imprime "Hola, mundo" en la consola puede ser:
NASM ofrece una variedad de instrucciones para manipular datos y controlar el flujo de
ejecución del programa. Algunas de las instrucciones más comunes incluyen:
- Movimiento de Datos: `mov`, que mueve datos entre registros y memoria.
- Operaciones Aritméticas: `add`, `sub`, `mul`, `div`, que realizan operaciones aritméticas.
- Operaciones Lógicas: `and`, `or`, `xor`, que realizan operaciones lógicas a nivel de bits.
- Control de Flujo: `jmp`, `cmp`, `je`, `jne`, `jg`, `jl`, que controlan el flujo de ejecución
del programa mediante saltos condicionales e incondicionales.
Acceso a Memoria
- Movimiento de Datos entre Registros y Memoria: `mov`, que se utiliza para cargar
datos desde la memoria en registros y viceversa.
- Acceso Directo a la Memoria: `mov`, `push`, `pop`, que se utilizan para acceder
directamente a la memoria sin utilizar registros intermedios.
- Instrucciones de Carga y Almacenamiento: `movsb`, `movsw`, `movsd`, que se utilizan
para transferir bloques de datos de un lugar a otro en la memoria.
EJEMPLO
Para esta etapa, necesitaremos que el programa NASM esté instalado en nuestra
computadora. Si tienes Debian o Ubuntu, simplemente escribe el comando:
Ahora que ya tenemos nuestro fichero objeto llamado "test.o" vamos a crear nuestro
ejecutable. Aquí se dan dos casos:
El programa inicia con un procedimiento llamado “_start”. Esto significa que el
programa posee su propio punto de entrada sin utilizar la función main. Esto no
cambia mucho, sin embargo necesitarás utilizar el comando ld para crear el
ejecutable:
ld test.o -o test
Para ejecutar nuestro programa llamado “test”, basta con escribir este comando:
./test
En Windows cambia la manera en la que se llama a los parámetros, la función llamada debe
limpiar ella misma la pila. Además, si tu punto de entrada es "_start" o "main", deberás
cambiarlo a "_WinMain@16" y sustituir “ret” por "ret 16". A continuación, un ejemplo
de un fichero fuente correcto utilizado en Windows:
section .text
global _WinMain@16
_WinMain@16:
mov eax, 0
ret 16
En primer lugar tendrás que instalar NASM y MinGW, si todavía no dispones de ellos en
tu ordenador. Una vez hecho esto, vamos a insertar NASM en el entorno de desarrollo
MingW. Descomprime el fichero NASM y deberías encontrar una carpeta que contiene un
archivo llamado nasm.exe. Copia este fichero en la carpeta C:\MinGW\bin.
Al igual que en Linux, no es necesario utilizar un editor específico para crear un fichero
fuente. Podemos utilizar, por ejemplo, el bloc de notas. Eso sí, debemos tener cuidado con
la extensión .txt. No se recomienda utilizar procesadores de texto como Word o WordPad
que pueden guardar el fichero en un formato no deseado. También puedes emplear un
editor que utiliza la coloración sintáctica para la sintaxis de NASM como NasmEdit IDE
(gratuito). En todos los casos se recomienda poner la extensión .asm.
ld test.o -o test.exe
Hall, Julian, et al. "The NASM Manual." Netwide Assembler (NASM) - A Portable
Assembler. Consultado en enero de 2022. https://www.nasm.us/doc/ .
Tatham, Simon. "Netwide Assembler (NASM)." GitHub Repository. Consultado en enero
de 2022. https://github.com/netwide-assembler/nasm .
Intel Corporation. "Intel® 64 and IA-32 Architectures Software Developer's Manual."
Consultado en enero de 2022.
https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html .
Muñoz, Alejandro. "Programación en Ensamblador." Consultado en enero de 2022.
https://es.wikipedia.org/wiki/Programaci%C3%B3n_en_ensamblador .
Irene, Burn “Ensamblador NASM: qué es y cómo utilizar en Linux y Windows”. 17/05/22
14:33 https://es.ccm.net/ordenadores/programacion/2206-compilar-un-programa-
ensamblador-con-nasm/ .
MIA J. Rafael Rojano C. “Introducción al NASM”
https://www.uv.mx/rrojano/arquitectura_dos/intro-nasm.pdf .
Peñalver, E. (2024, 26 abril). Esto es lo que Qualcomm no nos ha contado de sus CPU
Snapdragon X. HardZone. https://hardzone.es/noticias/procesadores/cpu-
snapdragon-x-qualcomm/
Salgado, F. (s. f.). Qué es un Ciclo Fetch. Scribd.
https://es.scribd.com/document/526415610/Que-es-un-Ciclo-Fetch?
doc_id=526415610&download=true&order=633541747
Celestino, N. (2017, 1 mayo). GoConqr - Ciclo Fetch. GoConqr.
https://www.goconqr.com/es/diapositiva/8735265/ciclo-fetch
González, A. H. (2017). Lenguaje ensamblador.
Ksolano. (s. f.). Ciclo de Fetch. Scribd. https://es.scribd.com/doc/22376834/Ciclo-de-Fetch
https://academia-lab.com/enciclopedia/arquitectura-de-harvard/
https://www.lifeder.com/arquitectura-von-neumann/
https://www.wikiwand.com/es/Arquitectura_Harvard_modificada
https://www.profesionalreview.com/2021/07/18/risc-vs-cisc/
https://yesenializbethguerrerogarcia.blogspot.com/2017/03/registros-de-lenguaje-
ensamblador.html