Guillermo,
El formato en el Arquisim es el siguiente:
etiqueta DB dup(cantidad) valor_inicial
O sea que para que lo acepte el arquisim deberia decir
rango_sensor DB dup(512) 0
Igualmente se entiende sin problemas la otra definición. Esa es una directiva del ensamblador y mientras se entienda no habría problema.
Hay otro par de detalles que hacen que no "compile" en el arquisim, por ejemplo la suma de constantes directo en una instrucción no está soportada. Pero de nuevo eso sería algo del ensamblador y no intrínseco de 8086.
Y hay una asignación que está mal (MOV DX, AH), debería cambiarse por MOV DL, AH y XOR DH, DH
Ah, y un bug por el cual DATA_SENSOR no es un nombre valido de etiqueta.
Aqui estaría el código compilable:
.data ; Segmento de datos
DATO_SENSOR EQU 10
VALVULAS EQU 2
D_CEDULA EQU 3
MASK_CTRL_VALVULA EQU 1 << D_CEDULA
VALVULAS_MAS_CEDULA EQU VALVULAS+D_CEDULA
;rango_sensor DB 512 dup(0)
rango_sensor DB dup(512) 0
.code ; Segmento de código
main proc
xor ax,ax
mov es,ax
mov word ptr es:[D_CEDULA], 0xF
mov word ptr es:[D_CEDULA+2], 0xFFF
sti; {habilitoInterrupciones}
loop:
jmp loop
ret ; para que no moleste el arquisim
main endp
new_data_from_sensor proc far
mov DX, DATO_SENSOR
in AX, DX ; lee puerto de E/S para obtener la informacion del sensor
xor BH, BH
mov BL, AH
SHL BX, 1 ; multiplico por el tamaño del elemento de la estructura
mov DX, [rango_sensor+BX]
cmp AL, DL
jae else
mov DL, AH ; cierra la valvula
xor DH, DH
; add DX, VALVULAS+D_CEDULA
add DX, VALVULAS_MAS_CEDULA
mov AX, 0
out DX, AX
jmp fin
else:
mov DL, AH ; abre la valvula
xor DH, DH
add DX, VALVULAS_MAS_CEDULA
mov AX, MASK_CTRL_VALVULA
out DX, AX
fin:
iret
new_data_from_sensor endp
Saludos,
Gustavo