Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41

С помощью прерывания нужно почитать дату и сверить со стандартной

21.12.2012, 00:01. Показов 4481. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сравнить заданную дату с датой на компьютере?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2012, 00:01
Ответы с готовыми решениями:

Нужно с помощью прерывания вывести фамилию, имя и отчество
Здравствуйте дали задание, нужно с помощью прерывания вывести фамилию имя отчество в таком виде Вася Пупкин Васильевич ...

Требуется сверить дату
procedure TForm2.FormCreate(Sender: TObject); begin DateTimePicker1.Date:=now; DecodeDate(myDate,myyear,myMonth,myday); if...

Как правильно сверить дату?
$date = strtotime('12.02.2014 20:00'); $date1s = date("d-m-Y", $date); $tomorrow = date("d-m-Y", strtotime('+1 DAY')); ...

54
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.12.2012, 00:22
1. Ввести дату
2. Получить текущею дату с компьютера (есть несколько способов)
3. Сравнить, начиная с года, месяц и день
0
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
21.12.2012, 00:24  [ТС]
а как это в коде будет выглядеть?
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.12.2012, 00:31
Code
1
2
3
4
5
6
7
8
9
10
---------------------------------------------
INT 1A - часы - READ DATE FROM REAL TIME CLOCK
       - считать дату из часов реального времени - (для AT,XT286,CONV,PS)
        AH = 04h
Возвращает: DL = день в двоично десятичном коде
            DH = месяц в двоично десятичном коде
            CL = год в двоично десятичном коде
            CH = век (19h или 20h)
Смотри: AH=05h,INT 21/AH=2Ah
---------------------------------------------
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
21.12.2012, 00:34  [ТС]
а как задать произвольную дату?
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.12.2012, 00:49
Дату задать - ввести с клавиатуры, преобразовать к виду как возвращает прерывание или значения после прерывания преобразовать к виду как с клавиатуры, а потом сравнивать.
Еще к получению даты:
Миниатюры
С помощью прерывания нужно почитать дату и сверить со стандартной   С помощью прерывания нужно почитать дату и сверить со стандартной  
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
21.12.2012, 03:41  [ТС]
Суть задания: Нужно написать программу, которая работает по заданным датам. Задается число и месяц. С помощью прерывания нужно почитать дату и сверить со стандартной. Если даты совпадают - то выводится сообщение: "Работать можно". Если нет - то "Работа завершена". Дату с компьютера я считал(только правильно ли?), не могу понять как записать произвольную дату в регистр EBX. Потом по идее я хотел сравнить даты, но тоже далеко не уверен, что правильно это сделал. Помогите пожалуйста исправить код, и если можно, написать комментарии. Буду очень благодарен))

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Model small
.data
mounth db 'mounth$'
chislo db 'chislo$'
msg0 db 'Work is true$'
msg1 db 'Work is false$'
.stack 100h
.code
start: 
    mov ax,@data
    mov ds,ax
    mov ax,3h
 
    int 10h
    mov ah,2ah
    int 21h
    mov ax,cx
    push dx
    mov ah,2ah
    int 21h
 
    xor EAX,EAX
    mov al,dl
    mov ah, 09h
    mov dx,offset chislo
    int 21h
 
    xor EAX,EAX
    mov al,dh
    mov ah,09h
    mov dx,offset mounth
    int 21h
 
    mov ah,10h
    int 16h
    mov ah,4Ch
    int 21h
 
    CMP EAX,EBX //не пойму как в регистр EBX записать произвольную дату
    JZ msg0
    mov ah,9
    int 21h
 
    CMP EAX,EBX //не пойму как в регистр EBX записать произвольную дату
    JNZ msg1
    mov ah,9
    int 21h
 
    mov ah,8
    int 21h
    mov ah,4Ch
    int 21h  
 
end start
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
21.12.2012, 03:58
OLEG VT, а твоя программа настроена так, что будет работать только с командами 8086 процессора, даже не все команды для 16-разрядного intel 80286 типа shr ax,3 на ней пойдут, тем более здесь не будет работать 32-разрядная команда CMP EAX,EBX
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
21.12.2012, 08:10  [ТС]
А как настроить для 32-разрядного? Или все же лучше на 16-разрядном писать?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
21.12.2012, 11:48
OLEG VT,
нужно именно в таком порядке
Assembler
1
2
3
4
5
6
.286; <--что бы работать со всеми командами 16-разрядного режима
.model small
.code
.686; <--  а это, если припрет работать с командами PentiumII
 
. . .
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
22.12.2012, 17:36  [ТС]
Вот я написал код, только он не выводит дату... Помогите пожалуйста исправить...
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.286
Model small
.data
mounth db 'mounth$'
chislo db 'chislo$'
.stack 100h
.code
start: 
    mov ax,@data
    mov ds,ax
    mov ax,3h
    
 
    int 10h
    mov ah,2ah
    int 21h
    mov ax,cx
    push dx
    mov ah,2ah
    int 21h
 
    xor ax,ax
    mov al,dl
    mov ah,09h
    mov dx,offset chislo
    int 21h
 
    xor ax,ax
    mov al,dl
    mov ah,09h
    mov dx,offset mounth
    int 21h
 
    mov ah,10h
    int 16h
    mov ah,4Ch
    int 21h
 
    CMP dx,ax 
    JZ db 'no work'
    mov ah,9
    int 21h
 
    CMP dx,ax
    JNZ db 'work'
    mov ah,9
    int 21h
 
    mov ah,8
    int 21h
    mov ah,4Ch
    int 21h  
 
end start
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
22.12.2012, 21:41
OLEG VT, напишите комментарии к вашему коду.

Добавлено через 2 часа 27 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
.286
Model small
.data
mounth db 'mounth$'
chislo db 'chislo$'
.stack 100h
.code
start: 
    mov ax,@data
    mov ds,ax
    mov ax,3h    ;AH=0 AL=3
    
 
    int 10h
;INT 10 - Видео прерывание - SET VIDEO MODE
;       - Установка видеорежима -
;        AH = 00h
;        AL = режим (графический режим если указано разрешение в графике)
;       текст        разм. графич.     цвет.  адр.стр. адаптер
;       разр.        симв. разр.              экрана
; 00h = 40x25        8x8               Ч/Б     8 B800 CGA
;     = 40x25        8x14              Ч/Б     8 B800 ATI VIP
; 01h = 40x25        8x8                16     8 B800 CGA
;     = 40x25        8x14               16     8 B800 ATI VIP
; 02h = 80x25        8x8               Ч/Б     4 B800 CGA
;     = 80x25        8x8               Ч/Б     8 B800 EGA,MCGA,VGA
;     = 80x25        8x14              Ч/Б     8 B800 ATI VIP
; 03h = 80x25        8x8                16     4 B800 CGA
;     = 80x25        8x8                16     8 B800 EGA,MCGA,VGA
; 04h = 40x25        8x8   320x200       4     1 B800 CGA
 
    mov ah,2ah    ;получить текущую дату
    int 21h
;INT 21 - DOS - GET CURRENT DATE
;       - получить текущую дату -
;        AH = 2Ah
;Возвращает: DL = день
;            DH = месяц
;            CX = год
;            AL = день недели (0=воскресенье, 1=понедельник, и т.д..)
 
    mov ax,cx    ;AX=CX
    push dx    ;DX сохранить в стеке (месяц\день)
 
    mov ah,2ah    ;получить текущую дату
    int 21h
 
    xor ax,ax    ;AX=0
    mov al,dl    ;DL - день, в регистр AL
 
    mov ah,09h    ;ф-ия вывода строки на экран
    mov dx,offset chislo    ;адрес строки chislo
    int 21h
;INT 21 - DOS - PRINT STRING
;       - печать строки -
;        AH = 09h
;        DS:DX -> строка оканчивающаяся на "$"
 
 
    xor ax,ax    ;AX=0
    mov al,dl    ;младшая часть адреса строки chislo в AL
    mov ah,09h    ;ф-ия вывода строки на экран
    mov dx,offset mounth    ;адрес строки mounth 
    int 21h
;INT 21 - DOS - PRINT STRING
;       - печать строки -
;        AH = 09h
;        DS:DX -> строка оканчивающаяся на "$"
 
 
    mov ah,10h
    int 16h
 
    mov ah,4Ch    ;завершение программы
    int 21h
;INT 21 - DOS 2+ - QUIT WITH EXIT CODE (EXIT)
;       - окончить программу с кодом возврата -
;        AH = 4Ch
;        AL = код возврата
;Возвращает: никогда не возвращается
;Примечание: если только процесс не является потомком (смотри AH=26h,
;            смещение 16h в PSP), то все файлы закрываются
 
;************** Дальше код не выполняется, программа уже завершилася!
    CMP dx,ax 
    JZ db 'no work'
    mov ah,9
    int 21h
 
    CMP dx,ax
    JNZ db 'work'
    mov ah,9
    int 21h
 
    mov ah,8
    int 21h
    mov ah,4Ch
    int 21h  
 
end start
Добавлено через 44 минуты
Давайте начнем с чистого листа. За полгода я не встретил условие задачи, которое требовало большой программы (большой объем кода и данных) – программы EXE, и в вашем случае тоже. Берем более простую реализацию – программу типа СОМ. В ней все сегментные регистры, если не потребуется другое – равны и так проще.
Программа типа СОМ:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
 
    mov ah, 09h
    mov dx,offset mounth
    int 21h
 
;ждать нажатой клавиши
    xor ax,ax
    int 16h
 
    ret ;выход из программы
;----Данные-------------
mounth db 13,10'Enter mounth$' ;13,10 - перевод строки и установка курсора в начало строки
chislo db 13,10,'Enter chisloo$'
;------------------------
    end start
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
22.12.2012, 21:54  [ТС]
AFP, а мне же еще сравнить надо даты.. Вот еще один код, он только ругается на две строчки: JZ db 'Work is true' и JNZ db 'Work is false'. Пишет: reserved word used as symbol. А так вроде бы все нормально
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
model tiny
.186
.data
mounth db 'mounth$'
chislo db 'chislo$'
.code
org 100h
begin:
    mov ax,@data
    mov ds,ax
    mov ax,3h
;устанавливаем текстовый режим
  mov ax,3
  int 10h
;выводим сообщение
  mov ah,9
  mov dx,offset Data_x
  int 21h
;получаем дату
  mov ah,2ah
  int 21h
;вывод дня
  mov al,dl
  xor ah,ah
  call OutNumber
;вывод месяца
  mov al,dh
  xor ah,ah
  call OutNumber
;вывод года
  mov ax,cx
  call outNumber
;любая клавиша
  xor ax,ax
  int 16h
  ret
;подпограмма вывода числа в десятичной системе
outNumber:
  pusha
;устанавливаем систему и счетчик цифр
  mov bx,10
  xor cx,cx
;делим на основание системы
isDiv:  xor dx,dx
  div bx
;запоминаем в стеке и увеличиваем счетчик цифр в стеке
  push dx
  inc cx
;повторяем пока Ах не равно 0
  or ax,ax
  jnz isDiv
;извлекаем из сткека число
isOut:  pop ax
;переводим его в символ
  or ax,30h
;выводим
  int 29h
  loop isOut
;выводим разделяющий пробел
  mov al,20h
  int 29h
  popa
  ret
Data_x  db 10,13,'Data:$'
    
    CMP dx,ax 
    JZ db 'Work is true'
    mov ah,9
    int 21h
 
    CMP dx,ax
    JNZ db 'Work is false'
    mov ah,9
    int 21h
 
    mov ah,8
    int 21h
    mov ah,4Ch
    int 21h  
end begin
Вот эта часть работает без нареканий:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
;устанавливаем текстовый режим
  mov ax,3
  int 10h
;выводим сообщение
  mov ah,9
  mov dx,offset Data_x
  int 21h
;получаем дату
  mov ah,2ah
  int 21h
;вывод дня
  mov al,dl
  xor ah,ah
  call OutNumber
;вывод месяца
  mov al,dh
  xor ah,ah
  call OutNumber
;вывод года
  mov ax,cx
  call outNumber
;любая клавиша
  xor ax,ax
  int 16h
  ret
;подпограмма вывода числа в десятичной системе
outNumber:
  pusha
;устанавливаем систему и счетчик цифр
  mov bx,10
  xor cx,cx
;делим на основание системы
isDiv:  xor dx,dx
  div bx
;запоминаем в стеке и увеличиваем счетчик цифр в стеке
  push dx
  inc cx
;повторяем пока Ах не равно 0
  or ax,ax
  jnz isDiv
;извлекаем из сткека число
isOut:  pop ax
;переводим его в символ
  or ax,30h
;выводим
  int 29h
  loop isOut
;выводим разделяющий пробел
  mov al,20h
  int 29h
  popa
  ret
Data_x  db 10,13,'Data:$'
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
22.12.2012, 22:07
Не, так не пойдет в принципе.
Первая засада:JZ db 'Work is true' и JNZ db 'Work is false'
JZ, JNZ это зарезервированные слова - команды условного перехода.

Не путайте языки высокого уровня с ассемблером - язык низкого уровня.
Сегодня уже не получится пообщат.
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
22.12.2012, 22:51  [ТС]
Ага, спасибо! Сейчас попробую с этим разобраться.

Добавлено через 36 минут
Еще нашел одно предупреждение: при tlink, пишет No stack.. Что это значит?
0
12 / 12 / 4
Регистрация: 13.10.2012
Сообщений: 279
22.12.2012, 23:23
нет стэка
1
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
23.12.2012, 19:34  [ТС]
Сейчас попробовал запустить программу, которая считывает дату с компьютера. Раньше работа, а теперь при tlink пишет No stack. Но в этой же программе есть стек.. В чем проблема может быть?

Добавлено через 6 часов 18 минут
Людиии, как исправить JN и JNZ? Не выдает ошибок при JC и JNC, но это же не будет относиться к моей программе?
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
23.12.2012, 20:50
OLEG VT, опишите алгоритм вашей программы. Что вводим, что выводим, что преобразуем, когда, что с чем сравниваем и т.д.
Какой код и тип файла берем за основу?
0
4 / 4 / 0
Регистрация: 19.12.2012
Сообщений: 41
23.12.2012, 21:12  [ТС]
Задаю данные, считываю их, заношу в регистр. Потом идет программа, которая считывает дату с компьютера. Потом по идее идет сравнение дат (ту, которую я сам ввожу, с датой, которую программа считала с компьютера). Если даты совпадают, то должно выводится сообщение, например Work is true, если не совпадают, то выводится Work is false. Все должно выводится в командной строке.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
23.12.2012, 21:22
Можно сравнивать по одной цифре, не вводя всей даты. Вводим, например год 2011.
Первый символ – 2. Получаем дату и сравниваем 2, совпала – вводим 0, не совпала – ошибка и т.д.
Можно ввести строку с датой, например 2011 12 23 или дд мм гггг, потом сравнивать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2012, 21:22
Помогаю со студенческими работами здесь

Как сверить системную дату с датой из реестра?
В реестре хранится дата окончания действия лицензии. Необходимо при запуске программы считать дату из реестра и сравнить с текущей. Если...

Вычислить значение y с помощью стандартной функции и с помощью ряда с точностью 0,0001
Ребята выручайте! 1. Дано действительное число x. Вычислить значение y с помощью стандартной функции и с помощью ряда с точностью...

Нужно сверить 2 файла
Возможно ли это реализовать через BAT ? Есть 2 txt файла в первом файле строки такого вида: https://www.yandex.ru/ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru