Summary of Codes, Circuits, and Digital Foundations

Codes, Circuits, and Digital Foundations: An Essential Student Guide

Introducción

La programación de bajo nivel se refiere a escribir instrucciones cercanas al hardware del computador: en lenguaje ensamblador o directamente en código máquina. Este material explica conceptos clave, muestra ejemplos prácticos y compara ideas relacionadas para permitir una comprensión sólida y aplicable en cursos universitarios.

Definición: La programación de bajo nivel implica el uso de instrucciones específicas del procesador (ensamblador o código máquina) que controlan directamente registros, memoria y periféricos.

1. Lenguajes de bajo nivel: ¿qué son?

  • Código máquina: Secuencia de bytes que la CPU ejecuta directamente.
  • Lenguaje ensamblador: Notación simbólica que representa las instrucciones de la CPU con mnemónicos (por ejemplo, MOV, ADD, CALL, RET).

Definición: Un ensamblador es un programa que convierte código en ensamblador (archivo fuente) en un archivo ejecutable de código máquina.

Ventajas y desventajas (comparativa)

AspectoVentajaDesventaja
ControlMáximo control sobre el hardwareMás propenso a errores humanos
EficienciaCódigo muy optimizado y compactoDesarrollo lento y laborioso
PortabilidadPuede aprovechar instrucciones específicas del CPUNo portable entre arquitecturas
AbstracciónPermite manipular registros, flags y punterosRequiere conocer arquitectura interna

2. Herramientas: ensamblador y cross-assembler

  • Ensamblador local: Traduce fuente .ASM a ejecutable (.COM, .BIN). Ejemplo: en CP/M, ASM.COM toma PROGRAM1.ASM y produce PROGRAM1.COM.
  • Cross-assembler: Se ejecuta en una máquina A pero genera código para otra máquina B.

Definición: Cross-assembler es un ensamblador que genera código ejecutable para una arquitectura distinta a la de la máquina donde corre.

Ejemplo práctico (resumen): Un archivo fuente con ORG, instrucciones LXI, MVI, CALL y DB puede ensamblarse en bytes de máquina que el sistema ejecuta para mostrar una cadena.

3. Estructuras de memoria y uso práctico: la pila (stack)

  • La pila es una región de RAM usada como LIFO (Last In First Out).
  • Operaciones básicas: PUSH (empujar) y POP (sacar).

Definición: Stack Pointer (SP) es el registro que apunta al tope de la pila y se ajusta (incrementa/decrementa) con PUSH/POP.

Comportamiento general (ejemplo conceptual):

  • Si SP = $8000_{16}$ y ejecutas PUSH de un par de registros (16 bits), SP se decrementa y las dos bytes se escriben en memoria en orden definido por la ISA.
  • Posteriormente, POP recupera las bytes y ajusta SP en sentido inverso.

Problemas potenciales:

  • Stack overflow: la pila crece y sobreescribe área usada por el programa.
  • Stack underflow: demasiados POP provocan lectura de datos inválidos.

4. Llamadas a subrutinas: CALL y RET

  • CALL guarda la dirección de retorno en la pila y salta a la subrutina.
  • RET recupera la dirección desde la pila y continúa la ejecución donde se llamó.

Uso recomendado:

  1. Guardar registros modificados por la subrutina con PUSH.
  2. Ejecutar la lógica de la subrutina.
  3. Restaurar registros con POP y RET.

Ejemplo esquemático (ensamblador conceptual):

  1. PUSH PSW ; salvar estado
  2. PUSH BC ; salvar BC
  3. ; cálculos que usan BC y registros
  4. POP BC
  5. POP PSW
  6. RET ; volver al llamador

5. Manipulación de datos y instrucciones útiles

  • PUSH/POP en el 8080 trabajan con pares de registros (16 bits): PUSH BC, POP DE, PUSH PSW (acumulador + flags).
  • LXI carga registros de 16 bits con un inmediato: LXI SP,0000h para inicializar la pila.
  • INX / DCX incrementan y decrementan pares de registros como valores de 16 bits.
  • DAD suma un par de registros a HL; afecta la bandera Carry y es útil para cálculos de direcciones.
  • SHLD / LHLD almacenan/cargan HL directamente desde/dentro de direcciones de memoria.
  • PCHL / SPHL cargan PC o SP a partir de HL (PCHL actúa como salto indirecto).
  • XTHL / XCHG permiten int
Zaregistruj se pro celé shrnutí
FlashcardsKnowledge testSummaryPodcastMindmap
Start for free

Already have an account? Sign in

Programación de bajo nivel

Klíčové pojmy: La programación de bajo nivel utiliza ensamblador y código máquina para control directo del hardware., Un ensamblador traduce mnemónicos a bytes de máquina y un cross-assembler genera código para otra arquitectura., La pila (stack) es memoria LIFO usada con PUSH y POP; SP (Stack Pointer) apunta al tope., CALL guarda la dirección de retorno en la pila; RET recupera esa dirección para volver., Instrucciones 16-bit como LXI, INX/DCX y DAD facilitan manipulación de direcciones y valores grandes., Rotaciones (RLC, RRC, RAL, RAR) mueven bits y afectan la bandera Carry; útiles para multiplicaciones por 2., Ensamlador vs compilador: ensamblador hace traducción 1:1; compilador genera múltiples instrucciones y optimiza., Buenas prácticas: comentar, preservar registros, inicializar SP y documentar convenciones de llamada.

## Introducción La **programación de bajo nivel** se refiere a escribir instrucciones cercanas al hardware del computador: en lenguaje ensamblador o directamente en código máquina. Este material explica conceptos clave, muestra ejemplos prácticos y compara ideas relacionadas para permitir una comprensión sólida y aplicable en cursos universitarios. > Definición: La programación de bajo nivel implica el uso de instrucciones específicas del procesador (ensamblador o código máquina) que controlan directamente registros, memoria y periféricos. ## 1. Lenguajes de bajo nivel: ¿qué son? - **Código máquina**: Secuencia de bytes que la CPU ejecuta directamente. - **Lenguaje ensamblador**: Notación simbólica que representa las instrucciones de la CPU con mnemónicos (por ejemplo, MOV, ADD, CALL, RET). > Definición: Un ensamblador es un programa que convierte código en ensamblador (archivo fuente) en un archivo ejecutable de código máquina. ### Ventajas y desventajas (comparativa) | Aspecto | Ventaja | Desventaja | | --- | ---: | --- | | Control | Máximo control sobre el hardware | Más propenso a errores humanos | | Eficiencia | Código muy optimizado y compacto | Desarrollo lento y laborioso | | Portabilidad | Puede aprovechar instrucciones específicas del CPU | No portable entre arquitecturas | | Abstracción | Permite manipular registros, flags y punteros | Requiere conocer arquitectura interna | ## 2. Herramientas: ensamblador y cross-assembler - **Ensamblador local**: Traduce fuente *.ASM* a ejecutable (*.COM*, *.BIN*). Ejemplo: en CP/M, ASM.COM toma PROGRAM1.ASM y produce PROGRAM1.COM. - **Cross-assembler**: Se ejecuta en una máquina A pero genera código para otra máquina B. > Definición: Cross-assembler es un ensamblador que genera código ejecutable para una arquitectura distinta a la de la máquina donde corre. Ejemplo práctico (resumen): Un archivo fuente con ORG, instrucciones LXI, MVI, CALL y DB puede ensamblarse en bytes de máquina que el sistema ejecuta para mostrar una cadena. ## 3. Estructuras de memoria y uso práctico: la pila (stack) - La **pila** es una región de RAM usada como LIFO (Last In First Out). - Operaciones básicas: **PUSH** (empujar) y **POP** (sacar). > Definición: Stack Pointer (SP) es el registro que apunta al tope de la pila y se ajusta (incrementa/decrementa) con PUSH/POP. Comportamiento general (ejemplo conceptual): - Si SP = $8000_{16}$ y ejecutas PUSH de un par de registros (16 bits), SP se decrementa y las dos bytes se escriben en memoria en orden definido por la ISA. - Posteriormente, POP recupera las bytes y ajusta SP en sentido inverso. Problemas potenciales: - **Stack overflow**: la pila crece y sobreescribe área usada por el programa. - **Stack underflow**: demasiados POP provocan lectura de datos inválidos. ## 4. Llamadas a subrutinas: CALL y RET - **CALL** guarda la dirección de retorno en la pila y salta a la subrutina. - **RET** recupera la dirección desde la pila y continúa la ejecución donde se llamó. Uso recomendado: 1. Guardar registros modificados por la subrutina con PUSH. 2. Ejecutar la lógica de la subrutina. 3. Restaurar registros con POP y RET. Ejemplo esquemático (ensamblador conceptual): 1. PUSH PSW ; salvar estado 2. PUSH BC ; salvar BC 3. ; cálculos que usan BC y registros 4. POP BC 5. POP PSW 6. RET ; volver al llamador ## 5. Manipulación de datos y instrucciones útiles - **PUSH/POP** en el 8080 trabajan con pares de registros (16 bits): PUSH BC, POP DE, PUSH PSW (acumulador + flags). - **LXI** carga registros de 16 bits con un inmediato: LXI SP,0000h para inicializar la pila. - **INX / DCX** incrementan y decrementan pares de registros como valores de 16 bits. - **DAD** suma un par de registros a HL; afecta la bandera Carry y es útil para cálculos de direcciones. - **SHLD / LHLD** almacenan/cargan HL directamente desde/dentro de direcciones de memoria. - **PCHL / SPHL** cargan PC o SP a partir de HL (PCHL actúa como salto indirecto). - **XTHL / XCHG** permiten int