• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

gamerX

Problemas função 2ch int 21h

9 mensagens neste tópico

Boas tardes! ;)

Estou com alguns problemas em usar a função 2ch da interrupção 21h.Pretendo guardr as horas e minutos e segundos do sistema num array mas cada vez que guardo aparacem-me guardados outros caracteres em vez de numeros que correspondessem ás horas e segundos!Será que é preciso fazer algum tipo de conversão?

Obrigada desde já pela ajuda!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Function 2Ch - Get system time

Action: Returns the time of day as held by the system clock.

On entry:              AH = 2Ch

Returns:             CH = hour(0 to 23)

                              CL = minute (0 to 59)

                              DH = second (0 to 59)

                              DL = centiseconds (0 to 99)


A função retorna números e não caracteres.

Deixa aí o código depois, para te ajudarmos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem,aqui está o código:

tempo db "0h0m0s$"


Vetempo proc

mov ah,2Ch
int 21h

ret

Vetempo endp
...

lea si,tempo
call vetempo
mov [si],ch
mov [si+2],cl
mov [si+4],dh 
...
call Vetempo
mov si,0
sub ch,[si]
mov [si],ch 
sub cl,[si+2]
mov [si+2],cl
sub dh,[si+4]
mov [si+4],dh

Espero que me consigam ajudar! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se Assembly é case-sensitive, deve depender do assembler, nesta linha: call vetempo talvez seja melhor alterares para Vetempo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu experimentei mudar e o resultado é o memso,continua sem dar... ;)

Fora isso o código estaria bem?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a tentar colocar os números obtidos pela interrupt como caracteres na string.

Tens que converter os inteiros em caracteres. E atenção que não estás a deixar espaço suficiente na string para horas com 2 algarismos.

Para converter, o algoritmo é mais ou menos este:

- Pegar nas horas (ou minutos, ou segundos) e DIV por 10; ficas com o quociente (dezenas) em EAX e resto (unidades) em EDX;

- se adicionares 30h (valor do caracter 0) a estes valores, ficas com o valor dos caracteres correspondentes aos dígitos das dezenas e das unidades das horas (ou minutos ou segundos)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigada pela dica!É que eu julgava que se coloca-se logo na string o resultado da interrupção ficavam logo lá os números...E se eu vez de uma string tiver um array assim:

tempo db 4 dup (?)

Será que assim já eram logo copiados numeros em vez de caracteres?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando faço essas divisões,não sei porquê dá-me um erro de "excesso na divisão"...Este é o código que tenho agora:

...
lea si,tempo; edit
     call Vetempo
    mov ax,... ;edit
    mov bl,10
    div bl
    add al,30h;dezenas
    add ah,30h;unidades
    mov [si],al ;edit
    mov [si+1],ah;edit
    mov al,cl
    mov bl,10
    div bl
    add al,30h
    add ah,30h
    mov [si+3],al
    mov [si+4],ah
    mov al,dh
    mov bl,10
    div bl
    add al,30h
    add ah,30h
    mov [si+6],al
    mov [si+7],ah
...

Consegui resolver o erro,no entanto agora não sei como vou fazer para copiar o conteúdo de ch (que contém as horas) para ax uma vez que não é possível mover um registo de 8 bits para 1 de 16 bits...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Problema resolvido!Obrigada a quem me respondeu e deu as dicas! :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora