Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75

Программа работает в консоли xp, но не работает в dosbox в 7ке

15.04.2018, 17:37. Показов 1928. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, проблему описал в заголовке, код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
.286
 
DSEG            SEGMENT
  STR_ALRLOADED db 'is unloaded ', 13, 10, '$'
  STR_NOTHING   db 'is not unloaded', 13, 10 , '$'
DSEG            ENDS
 
SSEG            SEGMENT STACK
                dw 50H DUP(?)
SSEG            ENDS
 
CSEG            SEGMENT
                ASSUME DS:DSEG, SS:SSEG, CS:CSEG, ES:NOTHING
 
RESIDENT       PROC    FAR
                jmp     BEGIN
 
  KEEP_IP       dw      ?
  KEEP_CS       dw      ?
  PSP           dw      ?
  SIGN          dw      1234H   
  COUNTER       db      'Number of calls:    '
  COUNT         db      '000'
 
BEGIN:          pusha
                push    DS
                push    ES
 
                mov     DX, SEG RESIDENT
                mov     DS, DX
 
                mov     DH, '0'
                mov     DL, '9'
                mov     DI, OFFSET COUNT+2
 
I_START:        cmp     DI, OFFSET COUNT
                jl      I_STOP
                cmp     [DI], DL
                je      I_ZERO
                mov     DL, [DI]
                inc     DL
                mov     [DI], DL
                jmp     I_STOP
 
I_ZERO:         mov     [DI], DH
                dec     DI
                jmp     I_START
 
I_STOP:         mov     AX, 1300H
                mov     BX, 000FH
                mov     CX, 0017H
                mov     DX, 0000H
                push    CS
                pop     ES
                mov     BP, OFFSET COUNTER
                int     10H
 
                pop     ES
                pop     DS
                popa
                mov     AL, 20H
                out     20H, AL
                iret
RESIDENT       ENDP
 
LAST_BYTE:
 
;-----------------------------
PRINT           PROC    NEAR
                push    AX
                mov     AX, 0900H
                int     21H
                pop     AX
                ret
PRINT           ENDP
 
;-----------------------------
MAIN            PROC    FAR
                mov     AX, DSEG
                mov     DS, AX
 
                mov     CS:[PSP], ES
                mov     DL, ES:[82H]
 
                mov     AX, 351CH
                int     21H
                mov     CS:[KEEP_CS], ES
                mov     CS:[KEEP_IP], BX
 
                cmp     DL, '/'
                jne     LOAD
 
                mov     DX, ES:[SIGN]
                cmp     DX, 1234H
                jne     NOTHING_UNLOAD
 
                cli
                push    DS
                push    ES
                mov     DS, ES:[KEEP_CS]
                mov     DX, ES:[KEEP_IP]
                mov     AX, 251CH
                int     21H
                pop     DS
                sti
 
                pop     ES
                push    ES
                mov     ES, ES:[PSP]
                mov     ES, ES:[2CH]
                mov     AX, 4900H
                int     21H
                pop     ES
                mov     ES, ES:[PSP]
                int     21H
 
                jmp     STOP
 
LOAD:           mov     DX, ES:[SIGN]
                cmp     DX, 1234H
                je      LOADED
 
                push    DS
                mov     DX, OFFSET RESIDENT
                mov     AX, SEG RESIDENT
                mov     DS, AX
                mov     AX, 251CH
                int     21H
                pop     DS
 
                mov     DX, OFFSET LAST_BYTE + 1F0H
                mov     CL, 4
                SHR     DX, CL
                inc     DX
                mov     AX, 3100H
                int     21H
                jmp     STOP
 
LOADED:         mov     DX, OFFSET STR_ALRLOADED
                call    PRINT
                jmp     STOP
 
NOTHING_UNLOAD: mov     DX, OFFSET STR_NOTHING
                call    PRINT
 
STOP:          mov  AH, 4Ch
               int  21h
MAIN            ENDP
CSEG            ENDS
                END MAIN
Можете помочь исправить?

Добавлено через 10 минут
хочу добавить, что программа не работает если запускать с ключом /un (dosbox виснет)

Добавлено через 1 минуту
запуская программу, мы загружаем обработчик прерываний, а запуская с ключом /un выгружаем его
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2018, 17:37
Ответы с готовыми решениями:

Граф. приложение+библиотеки+консольное приложение! Не работает программа без использования консоли. Если использую, то всё прекрасно работает.
Ребята нужна помощь,все вроде сделал, но приложение начинает зависать при запуске без использования консоли, если использую ее то все...

DOSBOX не работает
Надеюсь, я правильно выбрал раздел. Если нет, то скажите. Смысл следующий: Для выполнения задания из университета мне нужно...

Подключение библиотеки DLL C++: работает на примере консоли и не работает в WinForms App
Здравствуйте! Помогите начинающему бедному студенту!! Осваиваю С++. В книге Прохоренко(программирование в visual studio 2010 express)...

13
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
15.04.2018, 20:02
Значит не должна.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
15.04.2018, 22:55  [ТС]
то есть ее нельзя быстренько исправить, чтобы она работала в dosbox под win7?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
15.04.2018, 23:03
Вы бы для начала пояснили, что это за программа.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
15.04.2018, 23:07  [ТС]
реализация собственного обработчика прерываний от системного таймера.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
16.04.2018, 08:03
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

Попробуйте выполнить под отладчиком.
Возможно, что эмулятор DOS в WinXP и DOSBox по разному сохраняют содержимое регистров при вызове системных прерываний - в строке 83 что-то записывается в DL и после вызова int 21h в строке 90 выполняется проверка его содержимого.
Может что-то ещё.

Попробуйте выполнение под отладчиком.

Добавлено через 11 минут
В строках 97-115 извлечение регистров из стека не соответствует порядку их помещения.

Мне кажется, что вы не полностью реализовали необходимые перехваты ряда прерываний и не обрабатываете их.
Посмотрите небольшое описание с примерами
https://www.cyberforum.ru/post5664788.html
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
16.04.2018, 09:24
bikovbiv,
Assembler
97
98
99
100
101
102
103
104
                cli;******
                push    ES
                mov     DS, ES:[KEEP_CS]
                mov     DX, ES:[KEEP_IP]
                mov     AX, 251CH
                int     21H;******
                pop     DS
                sti;******
Скажите, что делают команды отмеченные "*"
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
16.04.2018, 12:51
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
в строке 83 что-то записывается в DL
Первый символ параметров командной строки. В программе полагается, что если этот символ / , то программа была запущена с ключом /un

Добавлено через 27 минут
Чтобы остальные не парились. В сообщениях программы unloaded следует понимать как loaded.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
16.04.2018, 13:04  [ТС]
Спасибо, исправил извлечение регистров и программа запустилась нормально
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
16.04.2018, 14:25
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

Цитата Сообщение от bikovbiv Посмотреть сообщение
хочу добавить, что программа не работает если запускать с ключом /un (dosbox виснет)
В 98-й и 99-й строке поменяй push-ы местами. Это явная ошибка. Из-за нее при запуске с ключом /un получается освобождение памяти с сегментом 0 и ДОС вполне может рушиться.
Вторая ошибка - некорректно обрабатываются параметры командной строки. Если ты хоть раз запустил программу с ключом /un , то в той-же области памяти где параметры командной строки так и будет лежать это /un и последующий запуск программы без параметров сработает как запуск с ключом /un. Но если запустить программу так
proga.exe shfahsdfakjajhgfa
то память заполняется этим хламом и /un затирается. Получается как бы запуск без /un

Добавлено через 1 минуту
А, блин, опоздал с советом
1
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
28.04.2018, 22:01  [ТС]
А не подскажите, как сделать, чтобы резидент выгружался, если запускать программу с ключом /un. Сейчас у меня выгружается по / , или если ввести что-либо после нее, я пытался сделать что-то типо этого засунуть после 89 строчки
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov     DL, ES:[80H]
                cmp     DL, 4
                jne     LOAD
                mov     DL, ES:[82H]
                cmp     DL, '/'
                jne     LOAD
                mov     DL, ES:[83H]
                cmp     DL, 'u'
                jne     LOAD
                mov     DL, ES:[84H]
                cmp     DL, 'n'
                jne     LOAD
Добавлено через 30 секунд
но так не выгружается
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.04.2018, 15:59
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

Примерно так :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    mov si, 81h
@@1:    mov al, es:[si]
    inc si
    cmp al, 0Dh
    je  no_param
    cmp al, '/'
    jne @@1
    cmp byte ptr es:[si], 'u'
    jne @@1
    cmp byte ptr es:1[si], 'n'
    jne @@1
    cmp byte ptr es:2[si], ' '
    ja  @@1
    jmp slash_un
 
no_param:
2
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
29.04.2018, 16:07  [ТС]
Большое спасибо, буду разбираться)
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.04.2018, 20:44
Ну вот и сбили теги асм четкую нарубку текста исходника табуляциями. Тег-то [ asm8 ] с настоящей табуляцией сделан или нет ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2018, 20:44
Помогаю со студенческими работами здесь

В Windows Forms некоректно работает метод, хотя в консоли работает правильно
//Данный метод должен заменять все элементы в массиве на 1, после найменьшего. public string getNewArray(int array) { ...

Программа работает при запуске в CodeLite, но не работает при запуске в консоли
Здравствуйте, подскажите пожалуйста в чем проблема??? При компилировании и запуске программы в приложении CodeLite, программа прекрасно...

Input value null работает в консоли, но не работает скриптом onclick
Всем привет. На кнопку повесил простой скрипт, чтобы все ячейки делать пустыми. Алертом и логом проверял, в скрипт заходит, но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru