Podrian ayudarme a optimizar y hacer más cortito este código?

108 views
Skip to first unread message

Clay

unread,
Apr 9, 2026, 11:18:54 AM (5 days ago) Apr 9
to Comunidad de Visual Foxpro en Español
Bien, aquí va mi pregunta: necesito implementar una X en el módulo de I/O, y tengo un código que me ha funcionado, pero no sé cómo optimizarlo (hacerlo más corto pero manteniendo la misma funcionalidad). Adjunto el código que escribí. Aparte les pasaré fot  del programa de ensamblador y del modulo de la tarjeta I/O, estoy usando la tarjeta de desarrollo DL 3155E24

CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H

PROGR:
    MOV AL,89H
    OUT 13H,AL

CICLO:
    MOV BL,01H

    MOV AL,00H
    OUT 10H,AL
    MOV AL,81H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,42H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,24H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,18H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,18H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,24H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,42H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

    MOV AL,00H
    OUT 10H,AL
    MOV AL,81H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH

    JMP CICLO

CODE ENDS
END PROGR
BOARD I O 03.jpeg
E24IDE.jpeg

Patricio Muñoz

unread,
Apr 9, 2026, 11:24:47 AM (5 days ago) Apr 9
to publice...@googlegroups.com
Hola Clay

La optimización no se muy factible, pero si se puede mejorar para su mantenimiento. Si te fijas tu codigo sigue un ciclo

MOV AL,00H
    OUT 10H,AL
    MOV AL,24H
    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

Lo que se me ocurre es pasar ese ciclo a datos en una base de datos, puede ser la intruccion completa ejemplo grabar en un campo "MOV AL,00H" y así con todos

entonces, tu despues solo consultas a la BD , te trae el set de codigos, obviamente ordenado , y listo..... con eso, si hay cambios, solo haces los cambios en la BD


Saludos

Patricio Muñoz
Pro&Tech
Ing. en Informática


--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/2777dc31-3cee-4dea-aee3-4bb9427d85e5n%40googlegroups.com.

Clay

unread,
Apr 9, 2026, 11:33:20 AM (5 days ago) Apr 9
to Comunidad de Visual Foxpro en Español
:D gracias por responder Inge Patricio. Soy muy muy MUY novata en esto de código ensamblador, asi que de verdad aprecio mucho tu respuesta. El planteamiento de la base de datos lo trataré de probar, la cuestión es que me piden que trate de modificar el código sin ayuda de base externa :( (solamente que el mismo código en el programa funcione sin ayuda de bases de datos).

Me podria decir usted q libros o blogs podría investigar un poco más sobre ello (en general de programación en ensamblador)?

Gracias nuevamente por tu ayuda :D

Claritza Zequeira
Estudiante de Ingeniería Electrónica. 

Hendell Mora

unread,
Apr 9, 2026, 2:04:57 PM (5 days ago) Apr 9
to publice...@googlegroups.com
Usando tabla PATRON
**************************************

ASSUME CS:CODE, DS:CODE
ORG 0H
PROGR:
    MOV AL,89H
    OUT 13H,AL
    LEA SI,PATRON
CICLO:
    MOV BL,01H
    MOV CX,8
SIGUIENTE:
    MOV AL,00H
    OUT 10H,AL
    LODSB

    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1
    LOOP SIGUIENTE
    JMP CICLO
PATRON DB 81H,42H,24H,18H,18H,24H,42H,81H
CODE ENDS
END PROGR
*****************************************

Sin TABLA
Para mantenimiento sin tabla, la mejor opción es usar etiquetas con valores explícitos + loop con contador. Esto mantiene legibilidad

1. Usar etiqueta FILA0 con valores explícitos en memoria (mantenimiento fácil)
2. Estructura con loop CX=8 y registro DI como pointer
3. MOV AL,[DI] carga valor, INC DI avanza, LOOP repite
4. Resetear DI con LEA DI,FILA0 al final de cada ciclo



ASSUME CS:CODE, DS:CODE
ORG 0H
PROGR:
    MOV AL,89H
    OUT 13H,AL
    LEA DI,FILA0   ; DI = pointer a valores
CICLO:
    MOV BL,01H
    MOV CX,8
SIGUIENTE:
    MOV AL,00H
    OUT 10H,AL
    MOV AL,[DI]   ; carga valor directamente de memoria

    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1
    INC DI
    LOOP SIGUIENTE
    LEA DI,FILA0  ; reset pointer
    JMP CICLO
FILA0:  DB 81H,42H,24H,18H,18H,24H,42H,81H
CODE ENDS
END PROGR


- Etiqueta FILA0 es autodescriptiva
- Los valores están visibles, no ocultos en una "tabla genérica"
- Fácil modificar: cambiás DB 81H,42H... directamente
*******************************

Oscar Bonet

unread,
Apr 9, 2026, 3:27:51 PM (5 days ago) Apr 9
to Comunidad de Visual Foxpro en Español
Utiliza la IA de Google Gemmini y verás en lo que te beneficia saberlo usar para estas cosas.
Solo debes explicarle en contexto que hace el procedimiento o función.

RS “Ricardo”

unread,
Apr 9, 2026, 11:12:17 PM (4 days ago) Apr 9
to Comunidad de Visual Foxpro en Español
Respuesta de CoPilot

Tu código actual repite muchas veces el mismo patrón de instrucciones, lo que lo hace largo y poco flexible. Una forma de optimizarlo es usar una tabla de valores y un bucle que recorra esa tabla, aplicando siempre la misma secuencia de operaciones. Así evitas duplicación y facilitas cambios futuros. Aquí te muestro una versión optimizada:

CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H

PROGR:
    MOV AL,89H
    OUT 13H,AL

CICLO:
    MOV BL,01H                ; valor inicial
    MOV SI,OFFSET TABLA       ; apuntador a la tabla
    MOV CX,8                  ; número de elementos en la tabla

BUCLE:
    MOV AL,00H
    OUT 10H,AL
    MOV AL,[SI]               ; cargar valor de la tabla

    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1
    INC SI                    ; avanzar al siguiente valor
    LOOP BUCLE

    JMP CICLO

TABLA DB 81H,42H,24H,18H,18H,24H,42H,81H

CODE ENDS
END PROGR

Mejoras aplicadas:

  • 📌 Uso de tabla (TABLA DB): en lugar de repetir bloques con valores fijos (81H, 42H, 24H, etc.), se almacenan en memoria y se recorren con un bucle.
  • 📌 Uso de SI y CX: SI apunta a la tabla y CX controla el número de iteraciones.
  • 📌 Menos código repetido: el bucle aplica la misma secuencia de instrucciones a cada valor de la tabla.
  • 📌 Flexibilidad: si quieres cambiar la secuencia de valores, basta con modificar la tabla, no todo el código.

Esto reduce el tamaño, mejora la legibilidad y facilita el mantenimiento.


aquí tienes una versión usando macros que encapsulan el patrón repetitivo. Así puedes invocar la misma secuencia con distintos valores sin duplicar código:

CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H

; Macro que ejecuta el patrón con un valor en el puerto 11h
SEQ MACRO valor
    MOV AL,00H
    OUT 10H,AL
    MOV AL,valor


    OUT 11H,AL
    MOV AL,BL
    OUT 10H,AL
    MOV AX,1
    INT 1CH
    SHL BL,1

ENDM



PROGR:
    MOV AL,89H
    OUT 13H,AL

CICLO:
    MOV BL,01H

    SEQ 81H
    SEQ 42H
    SEQ 24H
    SEQ 18H
    SEQ 18H
    SEQ 24H
    SEQ 42H
    SEQ 81H



    JMP CICLO

CODE ENDS
END PROGR

Reply all
Reply to author
Forward
0 new messages