Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > ошибка - segment-relocatable items


Автор: Eternal 3.3.2006, 03:52
Доброго времени суток.

проблема кароче такая:
пишу программу которая через каждые 30 тиков вызывает заданную процедуру (Dirki)
но часть считающяя тики в TSR. Есть кусок кода из учебника, но возникает ошибка cannot generate COM file :segment-relocatable items present ...

вот то шо у меня есть:

.model tiny
.386
.code
org 100h
Begin:
JMP Start
ALARMCOUNT DW ?
Dirki PROC NEAR
; call FREE_ENV
ret
Dirki ENDP

Start:
MOV AX,60
MOV BX,1092
MUL BX
MOV AH,0
INT 1AH
ADD AX,DX
MOV ALARMCOUNT,AX

PUSH DS
MOV AX,SEG ALARM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MOV DS,AX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MOV DX,OFFSET ALARM
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
ret

;--- резидентная часть
ALARM PROC FAR
PUSHF
PUSH AX
PUSH CX
PUSH DX
PUSH DS
PUSH CS
POP DS

MOV AH,0
INT 1AH

MOV CX,ALARMCOUNT
CMP DX,CX
JNE NOT_YET

CALL Dirki

NOT_YET: POPF
POP DS
POP DX
POP CX
POP AX
IRET
ALARM ENDP
end Begin

Строчки с знаками "!" неправильны, внимание вопрос smile - как правильно работать с сегментами чтоб ошибки не возникало?

Благодарю за внимание

Автор: Chingachguk 7.3.2006, 11:21
Ты ссылаешься на имена сегментов, которые у тебя не объявлены. Обычно сегменты используют в программах типа EXE (сегменты кода, данных и т.п.). Судя по твоей директиве ".model tiny" ты хочешь от компиллятора совсем другой модели программы - COM (один сегмент для всего).

Почитай про разные модели памяти где-нибудь, например у Зубкова С.В. (есть в сети).

Но вообще-то твоя задача (обработчик прерывания и еще что-то несложное) вроде бы не требует сегментов (хотя можно и использовать их). В той части кода, где у тебя "ошибки", требуется указать DOS (int 21h) ПОЛНЫЙ адрес обработчика прерывания 1Ch (user-таймер). Адрес должен быть указан в регистрах DS:DX. В регистре DS находится СЕГМЕНТНЫЙ адрес процедуры обработки прерывания. Поскольку ты используешь (.model tiny) модель памяти COM, то при старте программы такого типа И ТАК сегментные регистры будут заполнены адресом твоего - единственного ! - сегмента:

DS=SS=CS=ES= сегментный адрес твоей программы.

Поэтому в твоем случае достаточно написать:

Код

MOV DX,OFFSET ALARM 
MOV AX,251CH 
INT 21H 
ret


Автор: intophy 12.10.2022, 17:09
com 20 E2 AD 90 20The 20Viagra 20 20Viagra 20Krem 20Nedir 20Ne 20Ie 20Yarar the viagra The Libor floors and OIDs are unchanged <a href=https://buylasixon.com/>lasix purpose</a> To date, it has not been possible to develop inhibitors of Ras signaling with existing drug development technologies

Автор: smoogue 29.12.2022, 17:29
In one Australian study seventy- two women, aged 18 to 50 years were interviewed and they claimed to be dissatisfed with contraceptive choices including their side effects 3 <a href=http://bestcialis20mg.com/>tadalista vs cialis</a>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)