Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
1

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

15.04.2018, 17:37. Просмотров 858. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2018, 17:37
Ответы с готовыми решениями:

ПРограмма не работает
Вообщем есть программа, но она не работает. ПИшет, что ошибка в символе @. Подскажите как его...

Не работает программа
Доброго Вам времени суток. Есть программа, которая должна считать сколько четных элементов...

Не работает программа!
CSEG segment org 100h Start: mov ah,3 int 10h mov ax,0B800h mov es,ax mov al,1

Не работает программа
имеется прога которая удаляет лишние пробелы и заменяет пробел на символ "_", но она не работает(...

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

13
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
15.04.2018, 20:02 2
Значит не должна.
0
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
15.04.2018, 22:55  [ТС] 3
то есть ее нельзя быстренько исправить, чтобы она работала в dosbox под win7?
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
15.04.2018, 23:03 4
Вы бы для начала пояснили, что это за программа.
0
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
15.04.2018, 23:07  [ТС] 5
реализация собственного обработчика прерываний от системного таймера.
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
16.04.2018, 08:03 6
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

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

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

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

Мне кажется, что вы не полностью реализовали необходимые перехваты ряда прерываний и не обрабатываете их.
Посмотрите небольшое описание с примерами
http://www.cyberforum.ru/post5664788.html
1
Constantin Cat
2377 / 1073 / 368
Регистрация: 28.02.2015
Сообщений: 2,378
Завершенные тесты: 1
16.04.2018, 09:24 7
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
4856 / 1876 / 245
Регистрация: 17.02.2013
Сообщений: 2,792
16.04.2018, 12:51 8
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
в строке 83 что-то записывается в DL
Первый символ параметров командной строки. В программе полагается, что если этот символ / , то программа была запущена с ключом /un

Добавлено через 27 минут
Чтобы остальные не парились. В сообщениях программы unloaded следует понимать как loaded.
0
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
16.04.2018, 13:04  [ТС] 9
Спасибо, исправил извлечение регистров и программа запустилась нормально
0
Ethereal
4856 / 1876 / 245
Регистрация: 17.02.2013
Сообщений: 2,792
16.04.2018, 14:25 10
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

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

Добавлено через 1 минуту
А, блин, опоздал с советом
1
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
28.04.2018, 22:01  [ТС] 11
А не подскажите, как сделать, чтобы резидент выгружался, если запускать программу с ключом /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
4856 / 1876 / 245
Регистрация: 17.02.2013
Сообщений: 2,792
29.04.2018, 15:59 12
Лучший ответ Сообщение было отмечено 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
bikovbiv
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 73
29.04.2018, 16:07  [ТС] 13
Большое спасибо, буду разбираться)
0
Ethereal
4856 / 1876 / 245
Регистрация: 17.02.2013
Сообщений: 2,792
29.04.2018, 20:44 14
Ну вот и сбили теги асм четкую нарубку текста исходника табуляциями. Тег-то [ asm8 ] с настоящей табуляцией сделан или нет ?
0
29.04.2018, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2018, 20:44

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru