Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278

Реализация программной многозадачности. Проблема возникает при использовании "нового" стека

26.01.2014, 23:51. Показов 1995. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, обитатели форума.

Пытаюсь реализовать программную многозадачность, ибо аппаратная не устраивает по некоторым причинам.

Установила таблицу прерываний, задачи и механизм переключения по принципу делителя частоты. Проблема возникает при использовании "нового" стека. Если не трогать ESP и воспользоваться вставкой типа

Assembler
1
2
3
pop ebx
mov ebx,task__01 ;EIP
push ebx
с последующим Iretd, то все работает. Решила использовать вместо нее просто mov esp,task__02_stack
Перед этим, в этот стек пихаю:

EIP Со смещением первой команды задачи
CS С исходным значением
EFLAGS

Есть подозрения, что трабла в этом

Assembler
1
2
3
4
Pushfd
Pushd cs
Mov ebx,task__01 ;EIP
Pushd ebx
При запуске все вылетает жалуясь на отсутствие дескриптора. Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2014, 23:51
Ответы с готовыми решениями:

Реализация стека целых чисел. Процедура добавления нового элемента, удаление, вывод стека
Попросили написать программку, но, паскаль очень давно не практикую, поэтому прошу тут: Надо написать программу реализации стека целых...

Проблема при программной вставке столбца
excel2007 На листе в верхней строке объединенная ячейка, в ручном режиме при выделении столбца В выделяется 1 столбец запись макроса...

Реализация аппаратной многозадачности
Я реализую аппаратную многозадачность с одним tss для нулевого кольца. Вот код: mov ax, 48h ltr ax mov ebx, tss_s and byte ,...

15
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
27.01.2014, 08:37
можно весь кодес переключения?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
27.01.2014, 11:12  [ТС]
sh2ezo,
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
Mov esp,600000h
Pushfd
Push cs
Mov ebx,task1
Pushd ebx
 
Mov esp,700000h
Pushfd
Push cs
Mov ebx,task2
Pushd ebx
 
        sti
        jmp    $
 
    IDTR:
        dw IDT_size-1
        dd IDT
 
 
task1:
    mov esi, message2
    mov al, 0
    mov ah, 8
 
    Call OutText
 
    jmp $
 
task2:
 
    mov esi, message2
    mov al, 0
    mov ah, 8
    mov bl, 0Fh
    Call OutText
 
    Jmp $
 
 
OutText:
  
    xor edi, edi
    push eax
    shr eax, 8
    and eax, 0FFh
    imul edi, eax, 160
    pop eax
    and eax, 0FFh
    shl eax, 1
    add edi, eax
    add edi, 0B8000h
 
      .rep:
    cmp byte [esi],0
    jz .end
    mov bh, byte [esi]
    mov byte [edi], bh
    inc edi
    mov byte [edi], bl
    inc edi
    inc esi
 
    jmp .rep
       .end:
 
    ret
 
counter dd 0
 
irq0_handler:
 
 
inc [task_link]
Cmp [task_link],2
jz tsss2
 
tsss1:
 
Mov esp,600000h
 
;Pop ebx
;mov ebx,task1
;push ebx
 
jmp end_dispatch
 
tsss2:
 
Mov esp,700000h
;Pop ebx
;mov ebx,task2
;push ebx
 
Mov [task_link],0
 
 
jmp end_dispatch
 
;===========================
 
   end_dispatch:
    mov  al, 20h
    out  020h, al  
    out  0a0h, al
 
    iretd
 
 
task_link db 1
Код наикривейший, ибо писался в экспериментальных целях.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
27.01.2014, 14:31
ммммм...

600000h и 700000h - это вершины стеков. Пропашенные данные окажутся не над вершинами, а под ними. т.е. надо сделать как-то так:

Assembler
1
2
3
4
5
6
7
8
9
10
mov esp,<stack4task>
push  <eflags4task>
push <cs4task>
push <eip4task>
mov <stack4task>,esp
; тут что-то творим
irq0_handler:
; обработка таймера
mov esp,<stack4task>
iretd
Синтаксис какой-то левый, но суть ясна, я думаю
1
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 04:59  [ТС]
sh2ezo, благодарю, помогло. И еще вопрос. Команды типа push\pop и iretd как-то влияют на ESP? Не то в противном случае выходит, что при возникновении прерывания стек начинает расти вниз со скорость 12 байт-цикл, а iretd читает уже освобожденную область стека.

Добавлено через 1 час 45 минут
Все, получилось. Последняя проблема была в CALL, ибо он использует стек. Если поставить его между CLI и STI, то все замечательно работает. Получается какая-то гибридная многозадачность, с возможностью выполнения отрывков кода в реальном времени. Именно то, что мне нужно. sh2ezo, еще раз, спасибо.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 09:53
Цитата Сообщение от mashuly Посмотреть сообщение
Команды типа push\pop и iretd как-то влияют на ESP?
Глупый вопрос)
http://www.kolasc.net.ru/cdo/p... /push.html

Ещё мануалы от Intel помогают)
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 10:20  [ТС]
Цитата Сообщение от sh2ezo Посмотреть сообщение
Глупый вопрос)
Вставка типа mov <stack4task>,esp не работала в разных вариантах, значение просто оставалось прежним, хотя рассчитать его вручную не составило труда.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 10:36
странно, однако, что оставалось прежним..... кодес можно? и эмуль, на котором тесты проходят
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 11:04  [ТС]
sh2ezo,

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
ORG 100h
 
     STACK_BASE_ADDRESS      equ 200000h
     USER_PM_CODE_BASE_ADDRESS   equ 300000h
     USER_PM_CODE_SIZE equ USER_PM_CODE_END - USER_PM_CODE_BASE_ADDRESS
 
     CODE_SELEKTOR  equ 8h
     DATA_SELEKTOR  equ 10h
     VIDEO_SELEKTOR equ 18h
 
start:
        mov     ax,3
        int     10h
 
        in      al,92h
        or      al,2
        out     92h,al
 
        xor     eax,eax
        mov     ax, cs
        shl     eax,4
        add     eax, PROTECTED_MODE_ENTRY_POINT
        mov     [ENTRY_OFF],eax
 
        xor     eax,eax
        mov     ax,cs
        shl     eax,4
        add     ax, GDT
 
        mov     dword [GDTR+2],eax
        lgdt        fword [GDTR]
 
        cli
        in      al,70h
        or      al,80h
        out     70h,al
 
        mov     eax,cr0
        or      al,1
        mov     cr0,eax
 
        db      66h
        db      0EAh            
ENTRY_OFF   dd      PROTECTED_MODE_ENTRY_POINT            
        dw      CODE_SELEKTOR
 
align 8
GDT:
    NULL_descr  db      8 dup(0)
    CODE_descr  db      0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
    DATA_descr  db      0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
    VIDEO_descr db      0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h
    GDT_size    equ     $-GDT
 
label GDTR fword
        dw      GDT_size-1      
        dd      ?       
 
use32
 
PROTECTED_MODE_ENTRY_POINT:
        mov        ax, DATA_SELEKTOR
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        esp, STACK_BASE_ADDRESS
 
        call delta
     delta:
        pop ebx
        add ebx, USER_PM_CODE_START-delta
 
        mov        esi, ebx
        mov        edi, USER_PM_CODE_BASE_ADDRESS
        mov        ecx, USER_PM_CODE_SIZE
        rep        movsb
 
 
        mov        eax,USER_PM_CODE_BASE_ADDRESS
        jmp        eax
 
USER_PM_CODE_START:
ORG USER_PM_CODE_BASE_ADDRESS
 
        include 'PM_CODE.ASM';
 
USER_PM_CODE_END:

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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
INT_GATE equ 1000111000000000b
 
macro DEFINE_GATE _address,_code_selektor, _type
      {
       dw   _address and 0FFFFh ,_code_selektor,_type, _address shr 16
      }
 
IDT_size  equ IDT_END-IDT
 
task1sta equ 600000h
task2sta equ 700000h
 
    lidt    fword [IDTR]
 
    mov  bx, 2820h
    mov  al, 00010001b
 
    out 020h, al
    out 0A0h, al
    mov al, bl
    out 021h, al
    mov al, bh
    out 0A1h, al
    mov al, 00000100b
    out 021h, al
    mov al, 2
    out 0A1h, al
    mov al, 00000001b
    out 021h, al
    out 0A1h, al
 
        in   al, 70h
        and  al, 7Fh
        out  70h, al
 
        sti
 
    mov esi, message1
    mov al, 0
    mov ah, 1
    mov bl, 0Fh
 
    Call OutText
 
 
;EBX - Task
;ESP - Stack
 
Mov esp,task1sta
Pushfd
Push cs
Push task1
Pushad
 
Mov esp,task2sta
Pushfd        ;0-4
Push cs       ;4-8
Push task2    ;8-12
Pushad        ;12-44
 
 
Mov esp,200000h ;Начальный стек
 
        Sti
        Jmp    $
 
    IDTR:
        dw IDT_size-1
        dd IDT
 
task1:
 
    mov esi, message2
    mov al, 0
    mov ah, 2
    mov bl, 40h
       task1_print:
 
       Cli
       Call OutText
       Sti
 
       Inc dword [counter1]
       Jmp task1_print
 
message2 db 'Task1  ['
counter1 dd 11111111
db ']'
db 0
 
task2:
 
    mov esi, message3
    mov al, 0
    mov ah, 3
    mov bl, 0Fh
    task2_print:
 
       Cli
       Call OutText
       Sti
 
       Inc dword [counter2]
       Jmp task2_print
 
message3 db 'Task2  ['
counter2 dd 11111111
db ']'
db 0
 
OutText:
    pushad
    xor edi, edi
    push eax
    shr eax, 8
    and eax, 0FFh
    imul edi, eax, 160
    pop eax
    and eax, 0FFh
    shl eax, 1
    add edi, eax
    add edi, 0B8000h
 
      .rep:
    cmp byte [esi],0
    jz .end
    mov bh, byte [esi]
    mov byte [edi], bh
    inc edi
    mov byte [edi], bl
    inc edi
    inc esi
    jmp .rep
       .end:
       popad
    ret
 
irq0_handler:
Pushad
 
inc [task_link]
Cmp [task_link],2
jz tsss2
 
tsss1:
Mov esp,task1sta-44
jmp end_dispatch
 
tsss2:
Mov esp,task2sta-44
Mov [task_link],0
jmp end_dispatch
 
   end_dispatch:
 
    mov  al, 20h
    out  020h, al  
    out  0a0h, al
 
    Popad
    Iretd
 
task_link db 0
 
int_EOI:
    push ax
    mov  al, 20h
    out  020h, al  
    out  0a0h, al
    pop  ax
    iretd
    
exGP_handler:
    mov  esi, 5
    int  1
    iretd       
                
align 8        
IDT:
    dq 0 ; 0
    dq 0 ; 2
    dq 0 ; 2
    dq 0 ; 3
    dq 0 ; 4
    dq 0 ; 5
    dq 0 ; 6
    dq 0 ; 7
    dq 0 ; 8
    dq 0 ; 9
    dq 0 ; 10
    dq 0 ; 11
    dq 0 ; 12
    DEFINE_GATE exGP_handler, CODE_SELEKTOR,INT_GATE  ; 13  #GP
    dq 0  ; 14
    dq 0  ; 15
    dq 0  ; 16
    dq 0  ; 17
    dq 0  ; 18
    dq 0  ; 19
    dq 0  ; 20
    dq 0  ; 21
    dq 0  ; 22
    dq 0  ; 23
    dq 0  ; 24
    dq 0  ; 25
    dq 0  ; 26
    dq 0  ; 27
    dq 0  ; 28
    dq 0  ; 29
    dq 0  ; 30
    dq 0  ; 31
    DEFINE_GATE irq0_handler, CODE_SELEKTOR,INT_GATE  ; 20 (IRQ 0 - системный таймер)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE
       ;DEFINE_GATE irq1_handler, CODE_SELEKTOR,INT_GATE  ; 21 (IRQ 1 - клавиатура)ss
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 22 (IRQ 2 - ведомый контроллер прерываний)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 23 (IRQ 3 - COM2)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 24 (IRQ 4 - COM1)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 25 (IRQ 7 - LPT2)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 26 (IRQ 6 - FDD)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 27 (IRQ 7 - LPT1)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 28 (8)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 29 (9)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2A (10)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2B (11)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2C (12)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2D (13)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2E (14)
    DEFINE_GATE int_EOI, CODE_SELEKTOR,INT_GATE   ; 2F (15)
 
 
IDT_END:
 
    message1 db 'Protected mode',0
Добавлено через 51 секунду
Тут уже все отлажено, тестирую на dosbox.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 11:15
не. мне другой кодес. тот, где esp не меняет своего значения. очень интересно это
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 11:20  [ТС]
Его не осталось, но было нечто вроде

Assembler
1
2
3
4
5
6
Mov esp,stack1
Push ebx
Push cx
Pushfd
Mov stack1,esp
Mov
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 11:23
Assembler
1
2
3
Mov esp,[stack1]
;...
Mov [stack1],esp
а не так? FASM ведь юзается?

и CS до 4 байт расширяться должен
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 11:28  [ТС]
Цитата Сообщение от sh2ezo Посмотреть сообщение
и CS до 4 байт расширяться должен
Push cs и проблем не наблюдается. Магия FASM'а, что-ли...Но код получился рабочим.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 11:32
с моей поправкой рабочий-то?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.01.2014, 11:40  [ТС]
Да, рабочий.
Кстати, использование pushad\popad для сохранения и загрузки состояния задачи не наказуемо?
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
28.01.2014, 11:43
в FASM'е обращение к памяти идет через [память], потому мой код и рабочий.

Не наказуемо, ведь важна лишь скорость переключения, в общем-то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2014, 11:43
Помогаю со студенческими работами здесь

Возникает ошибка при использовании fscanf
Здраствуйте. Возникла такая проблема что при попытке что-то сделать с временной строкой 'с' выдается виндовская ошибка что пямать не может...

При использовании SaveAsBitmap() возникает ошибка
здравствуйте. помогите пожалуйста! в форме по нажатии одной кнопки происходит считывание данных из файла и по ним построение графика....

Возникает ошибка при использовании SetFocus
Возникает ошибка в этом коде, в чем трабла? for(int i = 0; i &lt; addnewprovider-&gt;ControlCount; i++) { ...

При использовании флеш-карты возникает интересная ситуация
Суть: когда вставляю флешку в USB порт на картридере, сразу вырубаются все устройства подключенные по USB. Что это может быть? Подозреваю...

При создании нового класса возникает ряд ошибок
Помогите разобраться, на что ругается студия? пустой проект создал по примеру https://www.cyberforum.ru/blogs/390663/blog2003.html ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере 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. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru