Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание простейшего планировщика процессов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Neon6868
Задание:
Написать на ассемблере IBM PC программу простейшего планировщика, обеспечивающего параллельное выполнение нескольких процессов.
В качестве процессов использовать циклически работающие процедуры, включенные в текст программы планировщика.
Для демонстрации своей работы процессы должны выполнять какие-либо преобразования в видеопамяти с использованием прямого доступа к ней (не используя сервис прерываний).
При выполнении работы руководствоваться требованиями:
1.Планировщик с добровольным переключением(использовать прерывание 60h
2.Циклическая очередь без приоритетов
3.Количество процессов - 3

У меня в программе 1 процедура выводит символ '1' на экран, 2 и 3 процедуры пока что ничего не делают. Когда запускаю программу, выводится сообщение: "Процессор обнаружил недопустимую инструкцию" и вылетает из командной строки. Подскажите плиз что не правильно и как исправить.

Программа:

model small
stack 100h
.286
.data
nomer db 0
max dw 101
smesh dw 0
segm dw 0
st1 db 256 dup(0)
st2 db 256 dup(0)
st3 db 256 dup(0)
save_ss dw 0
dw 0
dw 0
dw 0
save_sp dw 0
dw 0
dw 0
dw 0
stek dw 2
.code

my_proc proc
mov cl,nomer
cmp cx,0
je first
pusha
povtor:
mov si,stek
cmp si,8
je m2
mov si,2
m2:
mov ax,[save_ss+si]
mov ss,ax
mov bx,[save_sp+si]
mov sp,bx
add si,2
mov stek,si
mov al,nomer
inc ax
cmp ax,max
je vixod
mov nomer,al

popa
iret

first:
pusha
mov [save_ss],ss
mov [save_sp],sp


mov sp,offset st1+256
pushf
push cs
push offset proc1
pusha
mov [save_SS+2],ss
mov [save_sp+2],sp

mov sp,offset st2+256
pushf
push cs
push offset proc2
pusha
mov [save_SS+4],ss
mov [save_sp+4],sp

mov sp,offset st3+256
pushf
push cs
push offset proc3
pusha
mov [save_SS+6],ss
mov [save_sp+6],sp

jmp povtor

vixod:
mov ax,[save_ss]
mov ss,ax
mov bx,[save_sp]
mov sp,bx
popa
iret

my_proc endp

proc1 proc
mov ax,0B800h
mov es,ax
mov di,0
mov al,'1'
mov es:[di],al
int 60h

iret
proc1 endp

proc2 proc
int 60h
iret
proc2 endp

proc3 proc
int 60h
iret
proc3 endp

start:
mov ax,@data
mov ds,ax
mov ax,3
int 10h
mov ah,35h
mov al,60h
int 21h
mov cs:[smesh],bx
mov cs:[segm],es
mov ah,25h
mov al,60h
mov dx,offset my_proc
push cs
pop ds
int 21h

int 60h

mov ah,25h
mov al,60h
mov dx,cs:[smesh]
mov ds,cs:[segm]
int 21h

mov ax,4c00h
int 21h
end start

Neon6868
Написал в программе все правильно, но не понимаю почему не работает! Плиз ответьте кто-нибудь, а то что-то форум совсем умер. wink.gif
boba
а где ты ето писал
Neon6868
Цитата(boba @ 13.05.2008 10:50) *

а где ты ето писал


Писал в обычном блокноте, а потом компилировал с помощью TASM.

Добавлено через 10 мин.
Вот работающая программа:

model small
stack 100h
.286
.data
nomer db 0
max db 200
smesh dw 0
segm dw 0
st1 db 256 dup(0)
st2 db 256 dup(0)
st3 db 256 dup(0)
save_ss dw 0
dw 0
dw 0
dw 0
save_sp dw 0
dw 0
dw 0
dw 0
stek dw 2
.code

my_proc proc
mov ax,65535
cikl:
mov cx,10000
c2:
loop c2
dec ax
cmp ax,0
jne cikl
mov cl,nomer
cmp cx,0
je first
pusha
povtor:
mov si,stek
cmp si,8
jne m2
mov si,2
m2:
mov ax,[save_ss+si]
mov bx,[save_sp+si]
mov ss,ax
mov sp,bx
add si,2
mov stek,si
mov al,nomer
inc al
cmp al,max
je vixod
mov nomer,al

popa
iret

first:
pusha
mov [save_ss],ss
mov [save_sp],sp

mov ax,ds
mov ss,ax

mov sp,offset st1+256
pushf
push cs
push offset proc1
mov di,0
pusha
mov [save_SS+2],ss
mov [save_sp+2],sp

mov sp,offset st2+256
pushf
push cs
push offset proc2
mov di,0
mov bh,0
pusha
mov [save_SS+4],ss
mov [save_sp+4],sp

mov sp,offset st3+256
pushf
push cs
push offset proc3
mov di,0
mov bh,0
pusha
mov [save_SS+6],ss
mov [save_sp+6],sp

jmp povtor

vixod:
mov ax,[save_ss]
mov bx,[save_sp]
mov ss,ax
mov sp,bx
popa
iret

my_proc endp

proc1 proc
mov ax,0B800h
mov es,ax
mov al,'A'
mov es:[di],al
add di,2
int 60h
jmp proc1
proc1 endp

proc2 proc
mov ax,0B800h
mov es,ax
mov bl,es:[di]
inc bh
cmp bh,00001000b
jne m1
mov bh,00000001b
m1:
mov es:[di],bx
add di,2
int 60h
jmp proc2
proc2 endp

proc3 proc
mov ax,0B800h
mov es,ax
mov bx,es:[di]
add bh,10000000b
mov es:[di],bx
mov bh,0
add di,2
int 60h
jmp proc3
proc3 endp

start:
mov ax,@data
mov ds,ax
mov ah,35h
mov al,60h
int 21h
mov cs:[smesh],bx
mov cs:[segm],es
mov ah,25h
mov al,60h
mov dx,offset my_proc
push ds
push cs
pop ds
int 21h
pop ds
int 60h

mov ah,25h
mov al,60h
mov dx,cs:[smesh]
mov ds,cs:[segm]
int 21h

mov ax,4c00h
int 21h
end start



Можно 1 вопрос (мне препод задал): "Как в этой программе организована циклическая очередь без приоритетов и показать строки в программе, где это делается." Я ему 3 разных ответа дал, но всё не то. Подскажите плиз ответ, а то я видимо вопроса не понимаю.
Neon6868
Я все никак эту лабу не могу сдать. sad.gif Мне надо нарисовать как будет выглядеть стек в этой точке программы:

first:
pusha
mov [save_ss],ss
mov [save_sp],sp
Вот здесь!



Скажите плиз что я нарисовал не так, картинка ниже!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.