Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 17.09.2019, 01:49   #1
Николайка
Пользователь
 
Аватар для Николайка
 
Регистрация: 26.11.2009
Сообщений: 12
По умолчанию Выход в dos после int 20h - invalid opcode

В DosBox запускаю самую простую программу вывести Hello World!, все отрабатывает нормально, строка выводится
Код:
CSEG segment
assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
org 100h
 
Begin:
    mov ax,9
    mov dx,offset Message
    int 21h
        
    int 20h
 
 Message db 'Hello, world!$'
CSEG ends
end Begin
только при запуске в afdpro, при выполнении функции int 20h (выход в dos), начинается всякий беспредел.
В регистрах, и в сегментах появляются какие то левые данные, и результат - invalid opcode
Начинается нормально:
01.png
Заканчивается тоже нормально int 21h:
int 20h.png
после db все идет как то странно. Короче не выравниваются сегменты с регистрами, какие то другие значения в регистрах появляются:
invalid opcode.png
В результате ошибка..
Дело происходит в DosBox, расширение .COM

Последний раз редактировалось Николайка; 17.09.2019 в 01:52.
Николайка вне форума Ответить с цитированием
Старый 17.09.2019, 01:53   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,700
По умолчанию

Немного утомило отвечать Вам на нескольких форумах сразу.
Или отвечать, а потом обнаруживать, что соседи всё уже раасказали.
Пожалуй, я больше не буду Вам отвечать
Black Fregat вне форума Ответить с цитированием
Старый 17.09.2019, 02:18   #3
Николайка
Пользователь
 
Аватар для Николайка
 
Регистрация: 26.11.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
а потом обнаруживать, что соседи всё уже раасказали.
Извиняюсь, просто использую поиск на полную катушку. Я прослеживаю все ответы, просто не предполагал, что это не этично.. я не хочу что бы вы оставляли меня. Что мне в этом случае делать? Задавать вопрос только в одном форуме? Терпения просто у меня не хватило, не все оперативно отвечают, вот и вышло так.

Последний раз редактировалось Николайка; 17.09.2019 в 03:01.
Николайка вне форума Ответить с цитированием
Старый 17.09.2019, 16:38   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,700
По умолчанию

Если честно, не знаю.. Оставлять ссылки на другой форум - не по правилам.. Видимо, зря сорвался, прошу извинить.
Black Fregat вне форума Ответить с цитированием
Старый 17.09.2019, 16:49   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

INT 20

а скажите, а что Вы собираетесь отлаживать после int 20h ?
после Int20h Dos восстанавливает регистры прерываний и передаёт управление родительскому процессу (тому, который запустил вашу программу).
Вы собираетесь ОС DOS отлаживать под afdpro ?
или, может быть, код самого afdpro отлаживать им же?
Смысл отладки после завершения программы?

p.s. я понимаю, что мои вопросы не очень Вам помогут, но, честно, я не понимаю, зачем Вам знать то, что происходит после выхода из программы.

p.p.s. попробуйте заменить Int 20h на вызов функции DOS 4Сh:
Код:
        ;завершение программы
        mov     ax,     4C00h           ; Выводим результат
        int 21h                         ; Передаём управление ДОС для выполнения фукнкции
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.09.2019, 09:16   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,159
По умолчанию

попробуйте заменить Int 20h на вызов функции DOS 0:
Код:
        ;завершение программы
        mov     ah,0           
        int 21h; Передаём управление DOS для выполнения функции
передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20h Terminate. регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22h-24h (завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых буферов. файлы должны быть предварительно закрыты, если их длина изменилась.

Проще и более аккуратно - использовать функцию 4Ch DOS
Mikl___ вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запускается Windows 8, черный экран и после "выход из системы" Iren1993 Windows 2 07.02.2014 17:08
Кнопка Выход(на выход Из программы)С++ Напишите код ProGec4 Общие вопросы C/C++ 3 19.02.2012 14:36
выход после нажатия joks Общие вопросы C/C++ 3 16.11.2010 23:56
C#кнопка выход должна находиться в невидимом состоянии до 3 и после 5 кликов по картинкам jgosohbis Помощь студентам 2 30.09.2010 08:17
Чем отличается, если объявлять в классе переменные сразу после скобки и после public? TwiX Общие вопросы C/C++ 2 09.12.2009 16:11


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS