Tiempo Unix
tiempo de Unix en ASM
Colaborador: INBAR RAZ
vi un hilo que pasa por aquí, sobre el tema.
lo que pasa es que se han programado una cosa, para un determinado programa. & #39 s no
perfecto, en la esencia, que se va a producir buenos resultados sólo a partir de 1970 a
2099, porque yo no & #39 t ganas de comenzar a investigar que son los años bisiestos
y los que no lo son. Todos los años bisiestos entre 1970 y 2099 SE incluyen,
si.
& & & & & & & & & & & & & & & & -= cortar por aquí = & & & & & & & & & & & & & & & & -
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
{ Este procedimiento devuelve una LongInt UNIX timestamp. TimeRec serán }
{ sobreescrito por el resultado UNSIGNED DWORD. }
Procedimiento SecondSince1970(Año, Mes, Día, Hora, Minuto:Word Var TimeRec)
Var T_Lo,
T_Hi : Word
Begin
Asm
Llame a @Table
@Tabla:
Pop Si
Agregar Si,6 { Punto Si a los datos de la tabla }
Jmp @Informáticas
{ Esta tabla contiene el número de días, en todos los meses HASTA que este un }
dw 0 { Dentro de enero }
dw 31 { enero }
dw 59 { febrero }
dw 90 { Marte }
dw 120 { abril }
dw 151 { Mayo }
dw 181 { junio }
dw 212 { julio }
dw 243 { agosto }
dw 273 { septiembre }
dw 304 { octubre }
dw 334 { noviembre }
{ Esto quiero una rutina para multiplicar un valor DWORD por una PALABRA }
{ Entrada: DX:AX palabra a multilpy, CX multiplicador }
@Calc:
Empuje Si
Push Di
Mov Di,Dx
Mov Si,Ax
Dec Cx { ya Hemos multiplicado por 1 }
@Addit:
Add Ax,Si
Adc Dx,Di
Bucle @Addit
Pop-Di
Pop Si
Ret
@Calcular:
Xor Di,Di { Variable para el año bisiesto }
{ Segundos de la ronda de años }
Mov Bx,Año
Sub Bx,1970
Mov Ax,365*24 { Horas por año }
Mov Cx,60*60 { Segundos por hora }
Xor Dx,Dx
Llame a @Calc { Multiplicar dword respuesta por parte de CX }
Mov Cx,Bx
Llamada @Calc
Push Ax
Push Dx
{ Segundos de los años bisiestos }
Mov Ax,Año
Sub Ax,1972 { Primer año bisiesto después de 1972 }
Mov Bx,4
Xor Dx,Dx
Div Bx
{ DX ahora tiene el número de días a añadir becaues de los años bisiestos. }
{ Si DX es 0, este es un año bisiesto, y necesitamos tomar en
conideration }
Mov Di,Dx { Si DI es 0, este es un año bisiesto }
Inc Ax { debemos contar 1972 como bien }
Xor Dx,Dx
Mov Bx,60*60
Mov Cx,24
Mul Bx
Llamada @Calc
Mov Cx,Dx
Mov Bx,Ax
{ Ahora agregar a lo que teníamos antes }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
Push Ax
Push Dx
{ DX:AX contiene el número de segundos desde 1970 hasta principios de año
}
{ Agregar días dentro de este año }
Mov Bx,Mes
Dec Bx
Shl Bx,1
Add Bx,Si
Mov Bx,cs:[Bx] { Tabla de Búsqueda, la suma de los meses, EXCEPTO una }
Add Bx,Día { Agregar días dentro de este uno de los }
Dec Bx { Hoy ha & #39 t terminado todavía }
Mov Ax,60*60
Mov Cx,24
Xor Dx,Dx
Mul Bx
Llamada @Calc
Mov Cx,Dx
Mov Bx,Ax
{ Ahora agregar a lo que teníamos antes días hasta el comienzo del año }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
{ DX:AX, ahora tiene el número de secondss desde 1970 hasta principios de
día. }
Push Ax
Push Dx
{ DX:AX contiene el número de segundos hasta que el comienzo de este día }
Mov Bx,Horas
Mov Ax,60*60 { Segundos por hora }
Xor Dx,Dx
Mul Bx
Push Ax
Push Dx
Mov Bx,Minuto
Mov Ax,60 { Segundos por minuto }
Xor Dx,Dx
Mul Bx
Mov Cx,Dx
Mov Bx,Ax
Pop Dx
Pop Ax
Add Bx,Ax
Adc Cx,Dx
{ Y agregar los segundos, hasta que a principios de año }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
{ DX:AX alberga ahora el número de segundos desde 1970 }
Mov T_Hi,Dx
Mov T_Lo,Ax
Final
Mover(Mem[Seg(T_Lo):Ofs(T_Lo)],
Mem[Seg(TimeRec):Ofs(TimeRec)],2)
Mover(Mem[Seg(T_Hi):Ofs(T_Hi)],
Mem[Seg(TimeRec):Ofs(TimeRec) 2],2)
Final
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
& & & & & & & & & & & & & & & & -= cortar por aquí = & & & & & & & & & & & & & & & & -
Espero que esto ayude.
Inbar Raz
Tiempo Unix
Tiempo Unix : Multi-millones de consejos para hacer su vida mas facil.
tiempo de Unix en ASM
Colaborador: INBAR RAZ
vi un hilo que pasa por aqui, sobre el tema.
lo que pasa es que se han programado una cosa, para un determinado programa. & #39 s no
perfecto, en la esencia, que se va a producir buenos resultados solo a partir de 1970 a
2099, porque yo no & #39 t ganas de comenzar a investigar que son los años bisiestos
y los que no lo son. Todos los años bisiestos entre 1970 y 2099 SE incluyen,
si.
& & & & & & & & & & & & & & & & -= cortar por aqui = & & & & & & & & & & & & & & & & -
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
{ Este procedimiento devuelve una LongInt UNIX timestamp. TimeRec seran }
{ sobreescrito por el resultado UNSIGNED DWORD. }
Procedimiento SecondSince1970(Año, Mes, Dia, Hora, Minuto:Word Var TimeRec)
Var T_Lo,
T_Hi : Word
Begin
Asm
Llame a @Table
@Tabla:
Pop Si
Agregar Si,6 { Punto Si a los datos de la tabla }
Jmp @Informaticas
{ Esta tabla contiene el numero de dias, en todos los meses HASTA que este un }
dw 0 { Dentro de enero }
dw 31 { enero }
dw 59 { febrero }
dw 90 { Marte }
dw 120 { abril }
dw 151 { Mayo }
dw 181 { junio }
dw 212 { julio }
dw 243 { agosto }
dw 273 { septiembre }
dw 304 { octubre }
dw 334 { noviembre }
{ Esto quiero una rutina para multiplicar un valor DWORD por una PALABRA }
{ Entrada: DX:AX palabra a multilpy, CX multiplicador }
@Calc:
Empuje Si
Push Di
Mov Di,Dx
Mov Si,Ax
Dec Cx { ya Hemos multiplicado por 1 }
@Addit:
Add Ax,Si
Adc Dx,Di
Bucle @Addit
Pop-Di
Pop Si
Ret
@Calcular:
Xor Di,Di { Variable para el año bisiesto }
{ Segundos de la ronda de años }
Mov Bx,Año
Sub Bx,1970
Mov Ax,365*24 { Horas por año }
Mov Cx,60*60 { Segundos por hora }
Xor Dx,Dx
Llame a @Calc { Multiplicar dword respuesta por parte de CX }
Mov Cx,Bx
Llamada @Calc
Push Ax
Push Dx
{ Segundos de los años bisiestos }
Mov Ax,Año
Sub Ax,1972 { Primer año bisiesto despues de 1972 }
Mov Bx,4
Xor Dx,Dx
Div Bx
{ DX ahora tiene el numero de dias a añadir becaues de los años bisiestos. }
{ Si DX es 0, este es un año bisiesto, y necesitamos tomar en
conideration }
Mov Di,Dx { Si DI es 0, este es un año bisiesto }
Inc Ax { debemos contar 1972 como bien }
Xor Dx,Dx
Mov Bx,60*60
Mov Cx,24
Mul Bx
Llamada @Calc
Mov Cx,Dx
Mov Bx,Ax
{ Ahora agregar a lo que teniamos antes }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
Push Ax
Push Dx
{ DX:AX contiene el numero de segundos desde 1970 hasta principios de año
}
{ Agregar dias dentro de este año }
Mov Bx,Mes
Dec Bx
Shl Bx,1
Add Bx,Si
Mov Bx,cs:[Bx] { Tabla de Busqueda, la suma de los meses, EXCEPTO una }
Add Bx,Dia { Agregar dias dentro de este uno de los }
Dec Bx { Hoy ha & #39 t terminado todavia }
Mov Ax,60*60
Mov Cx,24
Xor Dx,Dx
Mul Bx
Llamada @Calc
Mov Cx,Dx
Mov Bx,Ax
{ Ahora agregar a lo que teniamos antes dias hasta el comienzo del año }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
{ DX:AX, ahora tiene el numero de secondss desde 1970 hasta principios de
dia. }
Push Ax
Push Dx
{ DX:AX contiene el numero de segundos hasta que el comienzo de este dia }
Mov Bx,Horas
Mov Ax,60*60 { Segundos por hora }
Xor Dx,Dx
Mul Bx
Push Ax
Push Dx
Mov Bx,Minuto
Mov Ax,60 { Segundos por minuto }
Xor Dx,Dx
Mul Bx
Mov Cx,Dx
Mov Bx,Ax
Pop Dx
Pop Ax
Add Bx,Ax
Adc Cx,Dx
{ Y agregar los segundos, hasta que a principios de año }
Pop Dx
Pop Ax
Add Ax,Bx
Adc Dx,Cx
{ DX:AX alberga ahora el numero de segundos desde 1970 }
Mov T_Hi,Dx
Mov T_Lo,Ax
Final
Mover(Mem[Seg(T_Lo):Ofs(T_Lo)],
Mem[Seg(TimeRec):Ofs(TimeRec)],2)
Mover(Mem[Seg(T_Hi):Ofs(T_Hi)],
Mem[Seg(TimeRec):Ofs(TimeRec) 2],2)
Final
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
& & & & & & & & & & & & & & & & -= cortar por aqui = & & & & & & & & & & & & & & & & -
Espero que esto ayude.
Inbar Raz
Tiempo Unix
By Consejos Y Trucos
Tiempo Unix : Multi-millones de consejos para hacer su vida más fácil.