Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2010, 22:02   #1
T(h)rasher
Пользователь
 
Аватар для T(h)rasher
 
Регистрация: 24.09.2010
Сообщений: 46
По умолчанию Проблема со стеком в проге на ассемблере

У меня есть написанная программа на ассемблере по обнаружению текущего диска - функция 19h прерывания 21h. При объявлении стека в asm-файле пишет ошибку: Fatal: Cannot generate COM file: stack segment present, это происходит после написания в командной строке команды создания com файла tlink /t (lab1). По идее стек здесь не нужен, но если его убрать, возникает варнинг после команды tlink (lab1), что стека нет, а после команды tlink /t (lab1) возникает ошибка Fatal: Cannot generate COM file: segment-relocatable items present in module lab1.asm. Если же заменить объявление стека на org 100h, то все тоже самое как и в случае отсутствия стека. Ко всему прочему прога не запускается, хотя все необходимые файлы - .map, .list, .exe, .obj - есть. Это тем более странно, что эта же прога у другого человека на другой машине нормально работает и на c и на d.
"...Before you accuse me take a look at yourself..."
T(h)rasher вне форума Ответить с цитированием
Старый 24.09.2010, 22:09   #2
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Самый простой (минимальный и достаточный) шаблон для создания COM программы - это такое:
Код:
.model tiny
.code
.startup

mov ax,blablabla
[здесь код]

END
Компилировать такое нужно с ключем /t
tasm proga.asm
tlink /t proga.obj
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 24.09.2010, 22:14   #3
T(h)rasher
Пользователь
 
Аватар для T(h)rasher
 
Регистрация: 24.09.2010
Сообщений: 46
По умолчанию

Спасибо за совет, с tiny я уже знаком, но проблема не столько в com файле(вообщем-то он и не нужен, равно как и объявление стека), а в самом стеке. Стек я объявил, т.к. раньше всегда так делал, но здесь мне сказали, что это лишнее действие и я убрал его, однако вопрос это не решило.
"...Before you accuse me take a look at yourself..."
T(h)rasher вне форума Ответить с цитированием
Старый 24.09.2010, 22:19   #4
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Стек в ком-файлах сам дос устанавливает на конец сегмента, при запуске программы. Так, как в ком-файлах никакого заголовка нет, то и нельзя самостоятельно задать его при ассемблировании. Можно только изменить сам указатель SP в программе, но нафиг это не надо в 99% случаев.

Давайте код, а то я не вижу ничего о чем мы говорим.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 24.09.2010, 22:40   #5
T(h)rasher
Пользователь
 
Аватар для T(h)rasher
 
Регистрация: 24.09.2010
Сообщений: 46
По умолчанию

Вот асмский файл:

;Определить текущий диск (на ассемблере)

.model small
include io.asm
;Макрокоманда вывода строки ASCII символов на экран
;Вызов: outstr str
;Параметры:
;str - идентификатор строки (в ds д.б. сегмент строки)
;Ограничение: в конце строки д.б. символ $ (24h) !!!
outstr macro str
push ax ;спасти ax,dx
push dx ;
lea dx,str ;адрес строки в dx
mov ah,9 ;номер функции DOS в ax
int 21h ;вызов функции 9 DOS
pop dx ;восстановить ax,dx
pop ax ;
endm

.data
mes db 'A:','$'
mes1 db 'B:','$'
mes2 db 'C:','$'
mes3 db 'D:','$'
mes4 db 'E:','$'
mes5 db 'F:','$'
mes6 db 'G:','$'
mes7 db 'H:','$'
mes8 db 'I:','$'
mes9 db 'J:','$'
mes10 db 'K:','$'

.code

main:
mov ax,@data
mov ds,ax ;сформировали DS
mov ah,19h ;номер функции - в AH
int 21h

cmp al,0
jne p1
outstr mes
jmp q

p1:
cmp al,1
jne p2
outstr mes1
jmp q

p2:
cmp al,2
jne p3
outstr mes2
jmp q

p3:
cmp al,3
jne p4
outstr mes3
jmp q

p4:
cmp al,4
jne p5
outstr mes4
jmp q

p5:
cmp al,5
jne p6
outstr mes5
jmp q

p6:
cmp al,6
jne p7
outstr mes6
jmp q

p7:
cmp al,7
jne p8
outstr mes7
jmp q

p8:
cmp al,8
jne p9
outstr mes8
jmp q

p9:
cmp al,9
jne p10
outstr mes9
jmp q

p10:
outstr mes10

q: mov ax,4c00h ;завершение программы c кодом 0
int 21h
end main
"...Before you accuse me take a look at yourself..."
T(h)rasher вне форума Ответить с цитированием
Старый 24.09.2010, 22:57   #6
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Жестокий код Можно сразу после .model small написать на следующей строке STACK 256. У меня так компилируется и работает.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 24.09.2010, 23:14   #7
T(h)rasher
Пользователь
 
Аватар для T(h)rasher
 
Регистрация: 24.09.2010
Сообщений: 46
По умолчанию

А почему жестокий? Мне кажется он довольно простой. Спасибо за совет, попробую. Я когда объявлял стек, делал это после .code перед main.
"...Before you accuse me take a look at yourself..."
T(h)rasher вне форума Ответить с цитированием
Старый 24.09.2010, 23:23   #8
T(h)rasher
Пользователь
 
Аватар для T(h)rasher
 
Регистрация: 24.09.2010
Сообщений: 46
По умолчанию

неа, не пашет((( пишет тоже самое - Fatal: Cannot generate COM file: stack segment present. Бред какой-то, может у меня что с компом не то....?
"...Before you accuse me take a look at yourself..."
T(h)rasher вне форума Ответить с цитированием
Старый 25.09.2010, 06:48   #9
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

товарищ ты уверен что это COM файл?

просто как бэ в .com файле сегмент стэка не объявляется и сегмент данных тоже
объявляется один сегмент кода

ASSSUME CS:CODE DS:CODE SS:NOTHING
jmp x-на начало программы
тут описание данных и процедур.

x:
блаблабла
end

.model small не знаю что это за херь,никогда не пользовался.

ну это в моём понимании.
вообще,почитай что такое com файл и с чем его едят.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 25.09.2010, 11:39   #10
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от T(h)rasher Посмотреть сообщение
неа, не пашет((( пишет тоже самое - Fatal: Cannot generate COM file: stack segment present. Бред какой-то, может у меня что с компом не то....?
Потому что это не COM файл. Компилировать нужно без ключа "/t".

Цитата:
Сообщение от T(h)rasher
А почему жестокий? Мне кажется он довольно простой.
Ну как-бы все тоже самое можно делать вот так:
Код:
.model tiny
.code
.startup
	mov ah,19h ;номер функции - в AH
	int 21h    ;Получить текущий диск в AL

	add al,'A' ;добавить к AL ACSII символ буквы 'A'
	mov dl,al  ; DL = AL

	mov ah,2   ;напечатать один символ на экране из DL
	int 21h

	mov dl,':' ;символ двоеточия
	int 21h	   ;печатаем после буквы двоеточие

	mov ax,4c00h
	int 21h	   ;ввыходим из программы
end
Это уже ком-файл и компилируется с ключем /t
Чтобы понять рекурсию, сперва нужно понять рекурсию.

Последний раз редактировалось Tronix; 25.09.2010 в 11:56.
Tronix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с массивами в ассемблере student2010 Помощь студентам 1 21.01.2010 19:16
Проблема с работой с файлами на ассемблере ed_ward Помощь студентам 1 04.01.2010 18:29
работа со стеком xarvenx Общие вопросы C/C++ 1 25.06.2009 13:31