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

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

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

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

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

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

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

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

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

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

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,162
По умолчанию

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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