|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.09.2010, 22:02 | #1 |
Пользователь
Регистрация: 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..."
|
24.09.2010, 22:09 | #2 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Самый простой (минимальный и достаточный) шаблон для создания COM программы - это такое:
Код:
tasm proga.asm tlink /t proga.obj
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
24.09.2010, 22:14 | #3 |
Пользователь
Регистрация: 24.09.2010
Сообщений: 46
|
Спасибо за совет, с tiny я уже знаком, но проблема не столько в com файле(вообщем-то он и не нужен, равно как и объявление стека), а в самом стеке. Стек я объявил, т.к. раньше всегда так делал, но здесь мне сказали, что это лишнее действие и я убрал его, однако вопрос это не решило.
"...Before you accuse me take a look at yourself..."
|
24.09.2010, 22:19 | #4 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Стек в ком-файлах сам дос устанавливает на конец сегмента, при запуске программы. Так, как в ком-файлах никакого заголовка нет, то и нельзя самостоятельно задать его при ассемблировании. Можно только изменить сам указатель SP в программе, но нафиг это не надо в 99% случаев.
Давайте код, а то я не вижу ничего о чем мы говорим.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
24.09.2010, 22:40 | #5 |
Пользователь
Регистрация: 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..."
|
24.09.2010, 22:57 | #6 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Жестокий код Можно сразу после .model small написать на следующей строке STACK 256. У меня так компилируется и работает.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
24.09.2010, 23:14 | #7 |
Пользователь
Регистрация: 24.09.2010
Сообщений: 46
|
А почему жестокий? Мне кажется он довольно простой. Спасибо за совет, попробую. Я когда объявлял стек, делал это после .code перед main.
"...Before you accuse me take a look at yourself..."
|
24.09.2010, 23:23 | #8 |
Пользователь
Регистрация: 24.09.2010
Сообщений: 46
|
неа, не пашет((( пишет тоже самое - Fatal: Cannot generate COM file: stack segment present. Бред какой-то, может у меня что с компом не то....?
"...Before you accuse me take a look at yourself..."
|
25.09.2010, 06:48 | #9 |
Форумчанин
Регистрация: 10.06.2010
Сообщений: 225
|
товарищ ты уверен что это COM файл?
просто как бэ в .com файле сегмент стэка не объявляется и сегмент данных тоже объявляется один сегмент кода ASSSUME CS:CODE DS:CODE SS:NOTHING jmp x-на начало программы тут описание данных и процедур. x: блаблабла end .model small не знаю что это за херь,никогда не пользовался. ну это в моём понимании. вообще,почитай что такое com файл и с чем его едят.
За помощь: Нажмите на весы слева от сообщения!
|
25.09.2010, 11:39 | #10 | ||
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Цитата:
Цитата:
Код:
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Последний раз редактировалось Tronix; 25.09.2010 в 11:56. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
проблема с массивами в ассемблере | student2010 | Помощь студентам | 1 | 21.01.2010 19:16 |
Проблема с работой с файлами на ассемблере | ed_ward | Помощь студентам | 1 | 04.01.2010 18:29 |
работа со стеком | xarvenx | Общие вопросы C/C++ | 1 | 25.06.2009 13:31 |