Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056

Выделение блока памяти, обработчик прерывания таймера

20.02.2018, 03:46. Показов 1958. Ответов 11

Студворк — интернет-сервис помощи студентам
всем привет! вобщем выкопал я из траншеи программу вывода времени, увы написанную не мной..
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
101
102
103
104
105
106
107
108
109
110
RGB EQU 1Fh         
VAD EQU 0B800h 
ROW EQU 1             
COL EQU 76          
SEP EQU 3Ah
 
TIME SEGMENT
ORG 100h
ASSUME CS:TIME, DS:TIME
.186 
 
START:             
JMP INIT
 
NewInt1C PROC
    PUSHA
 
    CLD 
    MOV AX,VAD 
    MOV ES,AX
    MOV DI,(ROW-1)*160+(COL-1)*2 
 
    MOV AL,4
    OUT 70h,AL
    IN AL,71h 
    MOV CH,AL
    MOV AH,RGB
    MOV CL,4 
    SHR AL,CL
    OR AL,30h
    STOSW
 
    MOV AL,CH
    AND AL,0Fh
    OR AL,30h
    STOSW
 
    MOV AL,SEP
    STOSW
 
    MOV AL,2
    OUT 70h,AL
    IN AL,71h 
    MOV CH,AL
    SHR AL,CL
    OR AL,30h
    STOSW
 
    MOV AL,CH
    AND AL,0Fh
    OR AL,30h
    STOSW
 
    POPA
 
         DB 0EAh 
Int1COfs DW ?
Int1CSeg DW ?
 
NewInt1C ENDP 
 
INIT:    
    CLI 
 
    MOV AX,351Ch
    INT 21h 
    MOV Int1COfs,BX
    MOV Int1CSeg,ES
 
    MOV AH,9
    MOV DX,OFFSET copyright
    INT 21h 
 
    MOV AH,4Ah
    MOV BX,16+14
    PUSH DS
    POP ES
    INT 21h 
 
    MOV AH,48h
    MOV BX,4
    INT 21h 
 
    MOV ES,AX 
    DEC AX
 
    MOV SI,OFFSET NewInt1C
    XOR DI,DI
    MOV CX,INIT-(OFFSET NewInt1C) 
    CLD
    REP MOVSB
 
    MOV ES,AX
    MOV WORD PTR ES:[1],0FFFFh
 
    XOR DX,DX
    INC AX
    MOV DS,AX
    MOV AX,251Ch
    INT 21h 
 
    STI 
 
    MOV AX,4C00h
    INT 21h 
 
copyright db 13,10,'Time! 3.9 - Coded By Sam In 1994 -' 
          db 'The Flamoots Production - 64 Bytes In Memory!$'
TIME ENDS
END START
в инициализации обработчика присутствует следующий фрагмент кода..
Assembler
1
2
3
4
5
6
DEC AX
...
MOV ES,AX
MOV WORD PTR ES:[1],0FFFFh
...
INC AX
для чего требуется данный фрагмент кода? если не трудно, то прошу тыкнуть меня носом в нужном направлении..
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2018, 03:46
Ответы с готовыми решениями:

Обработчик прерывания таймера: при одном проходе вывод на экран символ «?» , а на следующем проходе «#»
На языке ассемблер написать резидентную программу, которая бы обрабатывала прерывание по времени (timer) и при одном проходе выводила бы...

Выделение блока памяти нулевого размера
Каков результат оператора type* ptr = new type;?

Выделение блока памяти нулевой длины
привет можете помочь ответом или советом? >c.cpp chmod 777 c.cpp nano c.cpp

11
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
20.02.2018, 04:37
proc3nt, этот код забивает единицами поле owner в структуре MCB выделенного блока, что по идее должно разрывать связь блока с выделившим его процессом и не допускать его освобождения по int 21h 4Ch.
Подход к резиденту крайне сомнительный ввиду существования int 31h и настоятельных рекомендаций Microsoft не лезть напрямую в MCB.
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
20.02.2018, 19:49
Основная фишка тут немного в другом. Это вариация на тему Резидентная программа, занимающая минимальное кол-во памяти (без сохранения PSP), только упрощённая и от того не совсем правильная (т.к. PSP-то она удаляет, но оставит "дырку" в памяти между предыдущим выделенным блоком и резидентным кодом). Посему и функция ah=31h/int 21h или int 27h (а не int 31h всё-таки) тут не подходит
Я в своём примере делаю то же самое, только записываю туда 40h, а не 0FFFFh, что сути не меняет.
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
20.02.2018, 20:29  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
только записываю туда 40h, а не 0FFFFh, что сути не меняет
получается, что туда можно записать совершенно любое число, лишь бы оно только было записано
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
20.02.2018, 21:07
...лишь бы оно не было чьим-то PSP, так будет вернее. Некоторые операции используют эту информацию. Например, при выходе из программы DOS освобождает все сегменты, владельцем которых является текущая программа.

Добавлено через 1 минуту
Т.е. 1, 2, 10h, 40h, 0A000h, 0B000h, 0B800h, 0C000h, 0F000h, 0FFFFh, 0F123h и т.п. можно записывать совершенно спокойно.
А вот 1000h, 2000h, 5678h я бы не рекомендовал...

Добавлено через 8 минут
Хотя, я бы всё-таки использовал первые 40h значений (и не трогал 0A000h+), чтобы не было проблем с прогами, загруженными в UMB.
2
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.02.2018, 01:38  [ТС]
при запуске программа занимает всю доступную память. чтобы динамически выделить блок памяти под свои другие цели требуется освободить лишнюю память программы..
Assembler
1
2
3
4
5
MOV AH,4Ah 
MOV BX,16+14 
PUSH DS 
POP ES 
INT 21h
возник вопрос почему именно столько блоков оставлено программе. по-моему, 16 блоков (1 блок = 16 байтам) выделено для PSP (префикс программного сегмента), т.к. 100h = 256 = 16 блоков * 16 байт.
посчитал, что пользовательский обработчик занимает 63 байта, а инициализационная часть занимает 78 байт..
в сумме получается 141 байт \ 16 байт = 8 + 1 = 9 блоков. в программе указано 14 блоков..
для каких целей используются оставшиеся блоки?
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
21.02.2018, 01:41
Программа занимает 223 байта. Там же ещё текст.
2
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.02.2018, 04:43  [ТС]
блин! пролетело мимо моих глаз, а я в это время спал..
спасибо!

а вот еще интересный момент.. в конце пользовательского обработчика вызовется стандартный обработчик таймера без возврата обратно..
Assembler
1
2
3
DB 0EAh
Int1COfs DW ? 
Int1CSeg DW ?
вроде прерывание таймера является аппаратным прерыванием. в конце стандартного обработчика будет находиться команда выхода из прерывания iret? куда собственно осуществится выход, ведь по-сути адрес возврата в стек не записывался?
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
21.02.2018, 16:47
Смотри.
Во-первых, прерывание 1Ch не аппаратное, оно вызывается из прерывания 8 (аппаратного). Его рекомендуют перехватывать вместо 8-го.
Кликните здесь для просмотра всего текста
--------B-1C---------------------------------
INT 1C - TIME - SYSTEM TIMER TICK
Desc: this interrupt is automatically called on each clock tick by the INT 08
handler
Notes: this is the preferred interrupt to chain when a program needs to be
invoked regularly
not available on NEC 9800-series PCs
SeeAlso: INT 08,INT E2"PC Cluster"

Во-вторых, при возникновении аппаратного прерывания происходит всё то же самое, что и при вызове через int (into, int3, bound, при делении на 0 и т.д.), т.е. в стек так же записываются флаги, CS и IP. Поэтому при передаче управления старому обработчику (хоть int 8, хоть int 1Ch) он отрабатывает так, будто ничего до этого не выполнялось, и завершается инструкцией iret.
2
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.02.2018, 20:50  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Во-первых, прерывание 1Ch не аппаратное
пускай я не совсем корректно написал, но все равно в конце стандартного обработчика 8-го аппаратного прерывания стоит команда int 1Сh. обработчик этого программного прерывания по сути дела фиктивен, поскольку состоит из единственной команды iret

допустим, хочу убедиться в этом. ищу адрес вектора таймера в таблице векторов прерываний..
1Ch * 4 = 0070h : 0071h (смещение)
0070 + 2 = 0072h : 0073h (сегмент)

получается адрес сегмента обработчика прерывания таймера 020Сh, адрес смещения 06С0h..
перехожу по этим адресам, изменяя соответственно значения регистров cs и ip, в окно процессора..

почему обработчик начинается с команды jmp? да и вообще зачем куда-то прыгать, если в нем должна находиться только команда выхода iret, расположенная на одну команду выше данной?
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
21.02.2018, 21:14
Цитата Сообщение от proc3nt Посмотреть сообщение
в конце стандартного обработчика 8-го аппаратного прерывания стоит команда int 1Сh
Кто сказал, что в конце?
TechHelp пишет, что при вызове int 1Ch аппаратное прерывание IRQ 0 ещё не сборшено.

Цитата Сообщение от proc3nt Посмотреть сообщение
обработчик этого программного прерывания по сути дела фиктивен, поскольку состоит из единственной команды iret
Так и есть. Возможно, DOS его перехватывает (а может, и нет – не проверял).
Но чем тебя это смущает? Зачем туда прыгать (db 0EAh)? Так, мы же не знаем, перехватил ли его кто-то до нас или нет, правда?
Смотреть код обработчиков прерываний в DOSBox нет смысла. Там фикция
Надо смотреть загрузившись под чистым DOS'ом, на край из-под VMware (про Bochs не скажу, возможно, там тоже более или менее нормально).
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
21.02.2018, 23:01
Цитата Сообщение от proc3nt Посмотреть сообщение
при запуске программа занимает всю доступную память
В отличии от MZ(ЕХЕ)-файлов, в которых указаны в заголовке минимальный и желаемый размер памяти, в СОМ-фалах - заголовка нет. Ось не знает, что это за код и выделяет ему всю память, чтобы отцепились от неё. Также ОСь сама формирует стандартный PSP подставляет его под программу и только подом загружает сам код с фиксированного адреса 100Н.
Если посмотреть в отладчике PSP любого СОМ-файла, то первые 80Н байт его одинаковы для всех программ этого типа.

Цитата Сообщение от proc3nt Посмотреть сообщение
прерывание таймера является аппаратным прерыванием
Любое прерывание заканчивается IRET, Аппаратное прерывание, в отличии от программного имеет ещё и железную часть. В ней реализуется система приоритетов, пересылка данных DMA и ещё куча всего, что скрыто от ОСи и кодера драйверами различных контролеров внешних устройств.

Цитата Сообщение от proc3nt Посмотреть сообщение
да и вообще зачем куда-то прыгать, если в нем должна находиться только команда выхода iret, расположенная на одну команду выше данной?
У меня адреса несколько другие, но тенденция сохраняется, и только после выполнения перехода начинается, что-то похожее на обработчик. Если посмотреть, то в области памяти 0х020Е : 0х06С0, уж очень много таких JMP'ов. Думаю, что после запуска PC, загружаемая ОСь в наглую перебила джампами точки входа в обработчики BIOS на свой код.
Миниатюры
Выделение блока памяти, обработчик прерывания таймера  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2018, 23:01
Помогаю со студенческими работами здесь

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Нет прерывания от таймера 1.
Помогите пожалуйста. При совпадении TCNT1 и OCR1A прерывание приходит на вектор "Переход на обработку при готовности ЭСППЗУ". Где...

Обработчик прерывания
Есть некая программа, которая по прерыванию выводит набор значений в порт F (сразу на все пины, а не по одному). Есть структура в которой...

Включение и отключение прерывания таймера у STM32F4
Добрый день. Вопрос по обработке прерывания у таймера на STM32F4. Есть таймер, который измеряет длительность входного сигнала (ШИМ) в...

Не работает обработчик прерывания
Нужно, что бы программа при включенном CapsLock выводила глассные буквы, а при выключенном - только согласные. Собственно, программа...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru