Системный таймер - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Мне нужно получить текущее значение системного таймера (пишу на nasm) При попытке сделать так:
        push ds
        push 40h
        pop ds
        ...
        pop ds
возникает ошибка сегментирования. То есть до кода:
        mov eax, [ds:006ch]
дело даже не доходит. Используя прерывание,
        mov ah, 0
        int 1ah
опять же возникает ошибка сегментирования. Подскажите, пожалуйста, в чем проблема и как ее устранить? Заранее спасибо!

Решение задачи: «Системный таймер»

textual
Листинг программы
BITS 32
 
%define __NR_exit 1
%define __NR_getitimer 105
%define ITIMER_REAL 0
 
GLOBAL _start
 
SECTION .bss
timervalue resd 2  ; первое двойное слово - секунды, второе - микросекунды
 
SECTION .code
_start:
  mov eax,__NR_getitimer
  mov ebx,ITIMER_REAL
  mov ecx,timervalue
  int 80h
  ; результат в timervalue, значение с течением времени уменьшается (а не увеличивается)
 
  mov eax,__NR_exit
  xor ebx,ebx
  int 80h  ; выход из программы

Объяснение кода листинга программы

В коде используется системный вызов по адресу 105 (getitimer) для установки интервала времени. Переменная timervalue содержит начальное значение интервала. После выполнения системного вызова значение переменной timervalue уменьшается (а не увеличивается) с течением времени. Затем используется системный вызов по адресу 1 (exit), передавая в него нулевое значение (xor ebx,ebx), что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5