```montagem
; Definir endereços de memória para controle de semáforos
TL_RED igual a 00H
TL_YELLOW igual a 01H
TL_GREEN equivalente a 02H
TL_CONTROL igual 03H
; Definir portas de E/S para controle de semáforos
OUTPUT_PORT igual a 04H
; Definir valores de atraso
DELAY_TIME igual a 10.000
organização 100H
; O programa principal começa aqui
principal:
mov al, TL_RED; Inicialize o semáforo para vermelho
mov [TL_CONTROL], al
loop jmp; Ir para o circuito
laço:
mov al, [TL_CONTROL]; Leia o status atual do semáforo
cmp al, TL_RED; Verifique se o semáforo está vermelho
eu sou vermelho; Se estiver vermelho, pule para o estado vermelho
cmp al, TL_YELLOW; Verifique se o semáforo está amarelo
eu sou amarelo; Se for amarelo, pule para o estado amarelo
cmp al, TL_GREEN; Verifique se o semáforo está verde
eu sou verde; Se estiver verde, pule para o estado verde
vermelho:
mov al, OUTPUT_PORT; Selecione a porta de saída para luz vermelha
fora al, 01H; Acenda a luz vermelha
atraso de chamada; Atraso de DELAY_TIME milissegundos
mov al, OUTPUT_PORT; Selecione a porta de saída para luz vermelha
fora al, 00H; Apague a luz vermelha
mov al, TL_YELLOW; Definir o status do próximo semáforo para amarelo
mov [TL_CONTROL], al
loop jmp; Ir para o circuito
amarelo:
mov al, OUTPUT_PORT; Selecione a porta de saída para luz amarela
fora al, 01H; Acenda a luz amarela
atraso de chamada; Atraso de DELAY_TIME milissegundos
mov al, OUTPUT_PORT; Selecione a porta de saída para luz amarela
fora al, 00H; Apague a luz amarela
mov al, TL_GREEN; Definir o status do próximo semáforo para verde
mov [TL_CONTROL], al
loop jmp; Ir para o circuito
verde:
mov al, OUTPUT_PORT; Selecione a porta de saída para luz verde
fora al, 01H; Acenda a luz verde
atraso de chamada; Atraso de DELAY_TIME milissegundos
mov al, OUTPUT_PORT; Selecione a porta de saída para luz verde
fora al, 00H; Desligue a luz verde
mov al, TL_RED; Definir o status do próximo semáforo para vermelho
mov [TL_CONTROL], al
loop jmp; Ir para o circuito
atraso:
mov cx, DELAY_TIME; Inicializar contador para atraso
xor dx, dx; Limpar registro dx
atraso_loop:
loop atraso_loop; Loop até o contador chegar a zero
ret