Родились сегодня:
lSemperFi


Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

392

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Советник

380

Россия, Санкт-Петербург


ID: 401888

puporev

Профессор

216

Россия, Пермский край


ID: 400669

epimkin

Профессионал

112


ID: 405338

vovaromanov.jr

1-й класс

103


ID: 242862

Hunter7007

Мастер-Эксперт

30

Россия, Омск


ID: 137394

Megaloman

Мастер-Эксперт

26

Беларусь, Гомель


8.10.2

13.10.2021

JS: 2.10.2
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-10-27 22:16:01-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 108890

Раздел: Assembler
Автор вопроса: Каликов Сергей Александрович
Дата: 11.11.2007, 04:33 Консультация закрыта
Поступило ответов: 1

Написал резидент который создает файл при обращении к 21h (вывод строки на экран) прерыванию и что-то он не работает подскажите в чем дело. И почему при востановлении из стека регистров CX и AX на метке B12 значение регистра CX пропадает и данные (09h) предназначенные для регистра AX попадают в CX.
Да, в одной из ваших рассылок видел, чтобы программу оставить резидентно необходимо вополнить 27h прерывание. Какой вариант лучше? Буду благодарен если пришлете правильный код программы, а то мучаюсь уже который день. Спасибо.

Приложение:

Здравствуйте, Каликов Сергей Александрович!

По не резидентной части:
mov ah,31h
LEA dx, init
int 21h

Эта функия резервирует объем памяти указанный в параграфах.
Параграф - 16-ти байтная область памяти
При компиляции Вашей программы компилятор записывает число 012Bh=299 т.е. резервируемая область памяти равна 4784(299*16) байта, при необходимых 299 байтах .
В Вашем случае выгодно использовать:
LEA dx, init
int 27h

вместо дополнительных вычислений:
mov ah,31h
LEA dx, init
shr dx,4
inc dx

int 21h


По резидентной части:
a10:
cmp ah,9
jne exit
;сохраняем все используемые регистры
pusha
;на момент вызова обработчика достоверно известен только CS
;DS - не известен, по этому его и определяем DS=CS, для функции 3Ch
;т.к. для открытия(создания) имя файла должно указыватся парой DS:DX
push ds
push cs
pop ds
mov ah,3ch
mov cx,00
lea dx,fil;У Вас обработчик будет пытатся открыть файл с именем
;по адресу DS:DX=??:103h, а там может быть и код вместо имени
pushf;возврат будет по IRET-это 3-и байта(flag, CS:IP)
CALL DWORD PTR cs:[saveint9]
;закрываем открытый файл
;т.к. при повторном открытии (уже открытого файла)может появится ошибка
;выполнения функции, которая Вами не учитывается.
mov bx,ax
mov ah,3eh
pushf;
CALL DWORD PTR cs:[saveint9]
pop ds;востанавливаем все регистры
popa
;в принципе тут можно вернутся по IRET
;если не нужно выводить строку
exit:
jmp cs:[saveint9]


Приблизительно так я бы написал такой обработчик.
ps: Для использования команд : pusha | pushf | popa | shr dx,4
поставте в начале программы директиву: .186- разрешить команды 186-го процессора
Удачи!

Зенченко Константин Николаевич

Старший модератор
12.11.2007, 17:55
Мини-форум консультации # 108890
Нет сообщений в мини-форуме
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 163

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 71

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0