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


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

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
Lapp
М
Теги, плз.
Правила Форума, п.5, и правила раздела Ассемблер, п.2



Цитата(krolik @ 31.05.2011 11:25) *
Задание:
Написать на ассемблере IBM PC программу простейшего планировщика, обеспечивающего параллельное выполнение нескольких процессов.
В качестве процессов использовать циклически работающие процедуры, включенные в текст программы планировщика.
Для демонстрации своей работы процессы должны выполнять какие-либо преобразования в видеопамяти с использованием прямого доступа к ней (не используя сервис прерываний).
При выполнении работы руководствоваться требованиями:
1.Планировщик с добровольным переключением(использовать прерывание 60h
2.Циклическая очередь без приоритетов
3.Количество процессов - 3
Программа вроде работает, пожалуйста прокомментируйте каждую сточку, а то что то не могу в ней разобраться

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

Погоди, а как это так - написал, работает, а разобраться не можешь? Что-то я не въезжаю в ситуацию..
krolik
эту работу я скачал с этого форума, осталось только в ней разобраться, а с комментариями было бы легче разобраться, помоги пожалуйста если сможешь
Lapp
Цитата(krolik @ 31.05.2011 14:46) *
эту работу я скачал с этого форума, осталось только в ней разобраться, а с комментариями было бы легче разобраться, помоги пожалуйста если сможешь

Так и пиши, откуда взял, хотя бы..
Нет, с ассемблером возиться никакого желания нет, уже несколько лет не прикасался к нему. Может, кто-то еще..
TarasBer
Асм такая штука...
Легче самому с нуля написать.
Неплохая разминка для ума, да. Правда, практического применения способности писать на асме такие простыни я придумать не могу.
leone.incognito
"mov ax,65535" заменил бы на "xor ax,ax и dec ax" smile.gif
а лучше инвертировать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.