2015-03-30 2 views
0

Я хочу получить текущую дату и время в NASM, в каком-то удобном формате. Я знаю, как получить timestamp (с системным вызовом sys_time), но есть много работы, чтобы получить полезную дату и время из timestamp. Вам нужно будет подсчитывать каждый год, месяц, день и принимать во внимание каждый високосный год, секунды прыжка (сколько их было до сих пор? И я не могу предсказать будущие прыжки секунд), поэтому, я думаю, должен быть способ, которым может справитесь с этим.NASM получить дату и время

Так что мой вопрос: есть ли способ получить текущую дату и время в удобном для использования способом, поэтому мне не нужно его вычислять из timestamp?

OS Я использую: CentOS 7

По некоторым данным, у меня вопрос такой же, как: How can I access system time using NASM? ну, это не совсем верно. Мой вопрос более конкретный (я не хочу отметки времени), и ответы из вышеизложенного не помогут мне, потому что либо дайте мне временную метку, либо вообще не работайте. Максимальный рейтинг ответов на инструкцию OUT, что приводит к сбою Sefmentation в моей системе.

+0

Если есть способ ОС может справиться с этим , мы должны знать о вас, пожалуйста, сообщите нам. – axelduch

+0

Я редактировал вопрос и добавил версию ОС –

+0

Возможный дубликат [Как получить доступ к системному времени с помощью NASM?] (Http://stackoverflow.com/questions/1465927/how-can-i-access-system-time-using- nasm) –

ответ

0

Вы можете использовать функции time и localtime в libc, чтобы получить tm struct, а затем делать все, что хотите, с полями в этой структуре.

Вот пример того, как вы могли бы сделать, что (это в ГАС/AT & T синтаксис, потому что это инструмент, который мне довелось иметь в наличии):

.equ tm_sec, 0 
.equ tm_min, 4 
.equ tm_hour, 8 
.equ tm_mday, 12 
.equ tm_mon, 16 
.equ tm_year, 20 
.equ tm_wday, 24 
.equ tm_yday, 28 
.equ tm_isdst, 32 

.bss 
now: .space 4 

.data 
fmt:  .ascii "%d-%02d-%02d" 
.byte 0 

.text 
.global _main 
_main: 

    # Get current time (see 'man time(2)') 
    pushl $now 
    call _time 
    addl $4,%esp 

    # Convert to a tm struct (see 'man localtime(3)') 
    pushl $now 
    call _localtime 
    addl $4,%esp 

    # Print the year, month, and day of month fields 
    pushl tm_mday(%eax) 
    movl tm_mon(%eax),%ebx 
    incl %ebx 
    pushl %ebx 
    movl tm_year(%eax),%ebx 
    addl $1900,%ebx 
    pushl %ebx 
    pushl $fmt 
    call _printf 
    addl $16,%esp 

    call _exit 
+0

Я совсем не знаком с синтаксисом (я новичок в ассемблере). И где вы получили _time, _localtime? Я получаю символ undefined ошибка на тех. –

+0

Эти функции находятся в 'libc'. Я строю с 'gcc -o test -lc test.s' – Michael

+0

' .equ' как '% define'. '.space' похоже на' resb'. 'pushl tm_mday (% eax)' как 'push dword [eax + tm_mday]'. Ох, и порядок операндов отменен (в синтаксисе AT & T вы пишете 'src, dest' вместо' dest, src'). – Michael