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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 17.09.2019, 02:49   #1
Николайка
Пользователь
 
Аватар для Николайка
 
Регистрация: 26.11.2009
Адрес: В России
Сообщений: 12
Репутация: 10
По умолчанию Выход в 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
Просмотров: 71

Размер: 29.5 Кб
Заканчивается тоже нормально int 21h:
Название: int 20h.png
Просмотров: 68

Размер: 22.6 Кб
после db все идет как то странно. Короче не выравниваются сегменты с регистрами, какие то другие значения в регистрах появляются:
Название: invalid opcode.png
Просмотров: 74

Размер: 28.5 Кб
В результате ошибка..
Дело происходит в DosBox, расширение .COM

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

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

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

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

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

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, 10:16   #6
Mikl___
Профессионал
 
Регистрация: 11.01.2010
Сообщений: 1,151
Репутация: 1029
По умолчанию

попробуйте заменить 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___ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


06:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.