Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 10
з курсу „ Системне програмування ”
Тема: Міжмодульна взаємодія.
Львів – 2004
Мета роботи: Ознайомитись з принципами спільного використання коду та даних між програмами під управлінням MS-DOS.
Короткі теоретичні відомості
Створюючи програмне забезпечення на мові Асемблера проектувальник потенційно може зіткнутись з такими ситуаціями:
необхідність компонування декількох програм написаних на різних мовах програмування (наприклад, для об‘єднання потужності мов високого рівня та ефективності асемблера);
програма, написана у вигляді одного модуля, може виявитись завеликою для асемблювання;
окремі модулі можуть бути написані різними проектувальниками з метою подальшої інтеграції;
з причини великого розміру виконавчого модуля може виникнути необхідність перекриття окремих частин програми в процесі виконання.
Кожна програма асемблюється окремо і генерує власний унікальний об‘єктний (OBJ) модуль. Програма компонувальник (LІNK) к правило виконання починається з основної програми, яка викликає одну або декілька підпрограм. Підпрограми, в свою чергу, можуть задіювати інші підпрограми.
Виклик іншої програми зумовлює необхідність міжсегментного (довгого) виклику (CALL). Дана операція спочатку записує до стеку вміст регістру CS і заносить до цього регістру адресу іншого сегменту, потім записує до стеку значення регістру ІP і заносить до цього регістру нову відносну адресу.
Таким чином, в стеку запам‘ятовуються і адреса кодового сегменту, і зміщення для наступного повернення з підпрограми.
Завдання на лабораторну роботу
Створити програму, що складається з трьох частин (головна програма та дві сервісні підпрограми), причому головна програма повинна виконувати функції координації та контролю роботи сервісних підпрограм.
В якості алгоритму роботи сервісних програм необхідно використати алгоритм програми створеної в процесі виконання лабораторної роботи № 6. Означений алгоритм необхідно розділити на дві взаємозв‘язані частини (окремі для кожної з сервісних програм) так, щоб результат виконання першої частини передавався в другу частину для подальшої обробки шляхом використання спільних для обох програм даних.
Взаємодію між основною та сервісними програмами необхідно організувати шляхом передачі параметрів через стек.
Вміст .asm-файлів
Основний модуль:
EXTRN GETCH:FAR
EXTRN PUTCH:FAR
STACKSG SEGMENT PARA STACK 'Stack'
DW 64 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
ControlCMsg db 10,13,' * Press any key to view its ASCII/EXT code *'
db 10,13,' * press CTRL+C to exit *$'
KeyMsg db 10,13,'Keypressed echo: $'
DATASG ENDS
;---------------------------------------------
CODESG SEGMENT PARA PUBLIC 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
mov dx,OFFSET ControlCMsg;
mov ah,09
int 21h
cycle:
mov dx,OFFSET KeyMsg
mov ah,09
int 21h
CALL GETCH
CALL PUTCH
jmp cycle
BEGIN ENDP
CODESG ENDS
END BEGIN
Перший модуль:
CODESG SEGMENT PARA PUBLIC 'Code'
GETCH PROC FAR
ASSUME CS:CODESG
PUBLIC GETCH
PUSH BP
MOV BP,SP
mov ah,01h
int 21h ; char in
cmp al,0
jz ext
mov bh,0 ;ascii
jmp print
ext: mov bh,1 ;ext
mov ah,01h
int 21h ; repeat for extended scan-code
print:
push AX
push BX ;SAVE DATA TO STACK
POP BP
RET
GETCH ENDP
CODESG ENDS
END
Другий модуль:
CODESG SEGMENT PARA PUBLIC 'Code'
PUTCH PROC FAR
ASSUME CS:CODESG,DS:CODESG
PUBLIC PUTCH
jmp strt
CodeMsg db 10,13,'ASCII-code: $'
ExtMsg db 10,13,'Extended-code: $'
KeyCode db 0,0,'$'
strt:
PUSH BP
MOV BP,SP
pop BX
pop AX ; GET DATA FROM STACK
mov bl,al ; put symbol to out register
mov ax,seg CodeMsg
mov ds,ax
;************ ?# digit ***********************
and al,0f0h
shr al,4
cmp al,09h
jg az01
add al,30h
mov KeyCode,al
jmp next01
az01: add al,37h
mov KeyCode,al
next01:
;************ #? digit ***********************
mov al,bl
and al,00fh
cmp al,9h
jg az02
add al,30h
mov KeyCode+1,al
jmp next02
az02: add al,37h
mov KeyCode+1,al
next02:
mov dx,OFFSET CodeMsg
cmp bh,1
jz extprn
jmp asciiprn
extprn:
mov dx,OFFSET ExtMsg
asciiprn:
mov ah,09
int 21h
mov dx,OFFSET KeyCode
mov ah,09
int 21h
POP BP
ret
PUTCH ENDP
CODESG ENDS
END
Висновок: Виконуючи дану лабораторну роботу, я ознайомився з принципами спільного використання коду та даних між програмами під управлінням MS-DOS.