1 / 49

Многомодульные программы

Многомодульные программы. Процедуры: организация вызова и возврата. Много файловые программы. Передача аргументов и возврат результатов. Обработка прерываний. Оператор CALL. Оператор RET. Стандартные возможности языка. Оператор CALL. Оператор RET. Стандартные возможности языка. SS.

jun
Download Presentation

Многомодульные программы

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Многомодульные программы Процедуры: организация вызова и возврата. Много файловые программы. Передача аргументов и возврат результатов. Обработка прерываний.

  2. Оператор CALL Оператор RET Стандартные возможности языка

  3. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog IP … Nearprog proc SP Ret(Retn)

  4. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog IP … Nearprog proc SP Ret(Retn)

  5. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog … Nearprog proc IP [IP] SP Ret(Retn)

  6. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog … Nearprog proc [IP] IP SP Ret(Retn)

  7. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog … Nearprog proc [IP] SP Ret(Retn) IP

  8. Оператор CALL Оператор RET Стандартные возможности языка SS Call Nearprog IP … Nearprog proc SP Ret(Retn)

  9. Оператор CALL Оператор RET Стандартные возможности языка SS Call Farprog IP … Farprog proc SP Ret(Retf)

  10. Оператор CALL Оператор RET Стандартные возможности языка SS Call Farprog IP … Farprog proc [IP] SP [CS] Ret(Retf) CS

  11. Оператор CALL Оператор RET Стандартные возможности языка SS Call Farprog … Farprog proc [IP] IP SP [CS] Ret(Retf) CS

  12. .model small.data x db ‘Print from subprog$’.code Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256 .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend 1 0000 .model small 2 0000 .data 3 0000 50 72 69 6E 74 20 66+ x db 'Print from subprog$' 4 72 6F 6D 20 73 75 62+ 5 70 72 6F 67 24 6 0013 .code 7 0000 Main proc 8 0000 B8 0000s mov ax,@data 9 0003 8E D8 mov ds,ax 10 0005 E8 FFF8 call subprog **Error** z1.asm(8) Undefined symbol: SUBPROG 11 .exit 0 1 12 0008 B8 4C00MOVAX,04C00h 1 13 000B CD 21INT 21h 14 000D Main endp 15 end main Файл 1 Файл 2

  13. .model small.data x db ‘Print from subprog$’ Extrn subprog:near.code Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256 .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend 1 0000 .model small 2 0000 .data 3 0000 50 72 69 6E 74 20 66+ x db 'Print from subprog$' 4 72 6F 6D 20 73 75 62+ 5 70 72 6F 67 24 6 0013 .code 7 0000 Main proc 8 0000 B8 0000s mov ax,@data 9 0003 8E D8 mov ds,ax 10 0005 E8 FFF8 call subprog 11 .exit 0 1 12 0008 B8 4C00MOVAX,04C00h 1 13 000B CD 21INT 21h 14 000D Main endp 15 end main Файл 1 Файл 2

  14. .model small.data x db ‘Print from subprog$’.codeExtrn subprog Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256 .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend 1 0000 .model small 2 0000 .stack 256 3 0000 .code 4 0000 Subprog proc 5 0000 B4 09 mov ah,9 6 0002 BA 0000 lea dx,x **Error** z2.asm(6) Undefined symbol: X 7 0005 CD 21 int 21h 8 0007 C3 ret 9 0008 Subprog endp 10 end Файл 1 Файл 2

  15. .model small.data x db ‘Print from subprog$’.codeExtrn subprog Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256Extrn x:byte .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend 1 0000 .model small 2 0000 .stack 256 3 0000 .code 4 0000 Subprog proc 5 0000 B4 09 mov ah,9 6 0002 BA 0000 lea dx,x 7 0005 CD 21 int 21h 8 0007 C3 ret 9 0008 Subprog endp 10 end Файл 1 Файл 2 Error: Undefined symbol SUBPROG in module Z1.ASM Error: Undefined symbol X in module Z2.ASM

  16. .model small.data x db ‘Print from subprog$’ Extrn subprog:near.code Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256Extrn x:byte .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend Файл 1 Файл 2

  17. .model small.data x db ‘Print from subprog$’ Extrn subprog:nearPublic x.code Main procmov ax,@datamov ds,ax call subprog .exit 0 Main endpend main .model small .stack 256Extrn x:bytePublic subprog .code Subprog procmov ah,9lea dx,xint 21hret Subprog endpend Файл 1 Файл 2

  18. Директивы управления областью видимости • EXTRN имя:тип[, имя:тип, …]- определяет внешнее имя и его тип:byte, word, dword, pword, fword, qword иtbyte для переменной;nearиfar – для процедуры;abs – для константы. • PUBLICимя[,имя, …]- делает каждое имя доступным всем другим модулям программы

  19. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS IP … Push arg_n Через регистры можно передать только ограниченное число параметров Call Prog … Prog proc Push ax Arg_1 SP … Retn/Retf

  20. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … IP Push arg_n Call Prog SP … Arg_n Prog proc … Push ax Arg_1 … Retn/Retf

  21. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … Push arg_n SP Call Prog [IP] … Arg_n IP Prog proc … Push ax Arg_1 … Agn_n equ [sp+2] Retn/Retf

  22. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … SP Push arg_n [ax] Call Prog [IP] … Arg_n Prog proc … IP Push ax Arg_1 … Agn_n equ [sp+4] !!! Retn/Retf

  23. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … SP Push arg_n Call Prog [IP] … Arg_n Prog proc … IP Push bp Arg_1 Mov bp,sp … Retn/Retf

  24. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … SP Push arg_n [bp] Call Prog [IP] … Arg_n Prog proc … Push bp Arg_1 IP Mov bp,sp … Retn/Retf

  25. Вызов процедуры с параметрами, передаваемыми через стек Push arg_1 SS … SP,BP Push arg_n [bp] Call Prog [IP] … Arg_n Prog proc … Push bp Arg_1 Mov bp,sp IP … Retn/Retf

  26. Вызов процедуры с параметрами, передаваемыми через стек SS Push arg_1 … SP Push arg_n … Call Prog BP [bp] … [IP] Prog proc Arg_n Push bp … Mov bp,sp Arg_1 … IP Retn/Retf Arg_n equ [bp+4]

  27. Возврат из процедуры с параметрами, передаваемыми через стек Push arg_1 SS … SP Push arg_n локальные Call Prog переменные BP … [bp] Prog proc [IP] Push bp Arg_n Mov bp,sp … … IP Arg_1 Mov sp,bp Pop bp Arg_n equ [bp+4]

  28. Возврат из процедуры с параметрами, передаваемыми через стек Push arg_1 SS … Push arg_n Call Prog SP,BP … [bp] Prog proc [IP] Push bp Arg_n Mov bp,sp … … Arg_1 Mov sp,bp IP Pop bp Arg_n equ [bp+4]

  29. Возврат из процедуры с параметрами, передаваемыми через стек Push arg_1 SS … Push arg_n Call Prog … SP Prog proc [IP] Push bp Arg_n Mov bp,sp … … Arg_1 Mov sp,bp Pop bp IP

  30. Возврат из процедуры с параметрами, передаваемыми через стек К-во памяти под локальные переменные Push arg_1 SS … Push arg_n Пролог процедуры:ENTER 0,0 Call Prog … SP Prog proc [IP] Push bp Arg_n Уровень вложен-ности Mov bp,sp … … Arg_1 Mov sp,bp Эпилог процедуры:LEAVE Pop bp IP

  31. Возврат из процедуры с параметрами, без очистки стека Push arg_1 SS … Push arg_n Call Prog … SP Prog proc [IP] … Arg_n … Mov sp,bp Arg_1 Pop bp IP Ret

  32. Возврат из процедуры с параметрами, без очистки стека Push arg_1 SS … Очистку стека производит вызывающая программа Push arg_n Call Prog IP Add sp,2*n … SP Prog proc Arg_n … … Mov sp,bp Arg_1 Pop bp Ret

  33. Возврат из процедуры с параметрами, с очисткой стека Push arg_1 SS … Push arg_n Call Prog … SP Prog proc [IP] … Arg_n … Mov sp,bp Arg_1 Pop bp IP Ret2*n

  34. Возврат из процедуры с параметрами, с очисткой стека Push arg_1 SS … Push arg_n Call Prog IP … Prog proc … Mov sp,bp SP Pop bp Ret2*n

  35. .model small .codePublicprint_ASCIIZ print_ASCIIZ procfarpush bpmov bp,sppush axpush sipush dslds si,[bp+2]cldprint_readchar: lodsb or al,aljz print_doneint 29hjmp print_readcharprint_done: mov [bp+2],sipop dspop sipop axpop bpret print_ASCIIZ endpend Пример

  36. .model small .stack 256print macro tp,strifidni <tp>,<String>extr print_ASCIIZ:far call print_ASCIIZdb '&str',0else .err 'Type error‘endifendm .codemainprocmov ax,@datamov ds,axprintSTRING,<This ASCIIZ-line will be printed> printstring,<This is second ASCIIZ line> .exit 0 main endpend main Print String 15 0001 .code16 0000 main proc17 0000 B8 0000s mov ax,@data18 0003 8E D8 mov ds,ax19 print STRING,<This ASCIIZ-line will be printed> 1 20 0005 0E E8 0000e call print_ASCIIZ 1 21 0009 db 'This ASCIIZ-line will be printed',02728 print string,<This is second ASCIIZ line> 1 29 002A 0E E8 0000e call print_ASCIIZ 1 30 002E db 'This is second ASCIIZ line',035 .exit 0 1 36 0049 B8 4C00 MOV AX,04C00h 1 37 004C CD 21 INT 21h38 004E main endp39 end main

  37. prog proc nearenter 0,0 arg_2 equ [bp+4] arg_1 equ [bp+6] prog proc farenter 0,0 arg_2 equ [bp+6] agr_1 equ [bp+8] Доступ к параметрам push arg_1push arg_2call prog push result push agr_1 push arg_2 call prog pop result prog proc ARG a:word,b:word=SBA Returns s:word enter 0,0 … leave ret SBAprog endp Место в стеке под результат Сохранение результата Имя и тип формального аргументаa equ [bp+4 или 6] Имя константы равной сумме размерностей типов аргументов Тип и имя результатаs equ [bp+sba+4 или 6]

  38. Пример .model small.stack 256.186.datax dw 5y dw 6z dw ?.codepr1 proc ARG a:word,b:word=SBA Returns s:word enter 0,0 mov ax,a add ax,b mov s,ax leave ret sbapr1 endp

  39. main procmov ax,@datamov ds,axpush zpush xpush ycall pr1pop zmain procmov ax,@datamov ds,axpush zpush xpush ycall pr1pop z .exit 0 main endpend main

  40. 1 0000 .model small 2 0000 .stack 256 3 .186 4 0000 .data 5 0000 0005 x dw 5 6 0002 0006 y dw 6 7 0004 ???? z dw ? 8 9 0006 .code 10 0000 pr1 proc 11 =0004 ARG a:word,b:word=SBA Returns s:word 12 0000 C8 0000 00 enter 0,0 13 0004 8B 46 04 mov ax,a 14 0007 03 46 06 add ax,b 15 000A 89 46 08 mov s,ax 16 000D C9 leave 17 000E C2 0004 ret sba 18 0011 pr1 endp

  41. 19 20 0011 main proc 21 0011 B8 0000s mov ax,@data 22 0014 8E D8 mov ds,ax 23 24 0016 FF 36 0004r push z 25 001A FF 36 0000r push x 26 001E FF 36 0002r push y 27 0022 E8 FFDB call pr1 28 0025 8F 06 0004r pop z 29 30 .exit 0 1 31 0029 B8 4C00 MOV AX,04C00h 1 32 002C CD 21 INT 21h 33 002E main endp 34 end main

  42. Таблица описанных имен A Number [DGROUP:BP+0004] B Number [DGROUP:BP+0006] MAIN Near _TEXT:0011 PR1 Near _TEXT:0000 S Number [DGROUP:BP+0008] SBA Number 0004 X Word DGROUP:0000 Y Word DGROUP:0002 Z Word DGROUP:0004

  43. Обработка прерываний • Внешние прерывания – запросы поступившие от внешних устройств. • Внутренние прерывания – инициализируются процессором как реакция на программные ошибки или прерывания пользователя (int). … SP Таблицавекторовпрерываний Flags CS ? [CS] IP ? [IP]

  44. Примеры прерываний

  45. Структура таблицы векторов прерываний 60h÷66h –свободны Номер вектора Адрес 00000 0 [I P] [C S] 00004 1 [I P] [C S] 00008 2 [I P] [C S] 0000c 3 … 00194 65h 0 0 0 0 003fc 256

  46. Структура таблицы векторов прерываний Номер прерывания Номер функции DOS 60h÷66h –свободны mov ax,2565hlds dx,ppopint21h Номер вектора Адрес 00000 0 [I P] [C S] 00004 1 [I P] [C S] 00008 2 [I P] [C S] 0000c 3 … Указатель на программу пользователя обработки прерывания 00194 65h offset ppop seg ppop 003fc 256

  47. Пример .model small.stack 256.dataline db 1sym db 01hatrb db 19hcolumn=10 .code new_65h proc mov ah,6 ; Функция задания окна mov al,0 ; Режим создания окна mov bh,atrb ; Атрибут символов в окне mov cx,0 ; Левый верхний угол mov dx,2479h ; Нижний правый угол int 10h ; Прерывание BIOS iret; Возврат из обработки прерывания new_65hendp

  48. main procmov ax,@datamov ds,ax mov ax,2565h ; Функция заполнения вектора прерыванияpush dslea dx,new_65h ; Смещение функции обработки прерыванияpush dspush cspop ds ; Сегмент функции обработки прерыванияint 21h ; Вызов DOSpop ds ; Восстановление индекса сегмента данных m1: int 65h ; Вызов прерывания пользователяmov ah,2 ; Функция позиционирования курсораmov bh,0 ; Видеостраницаmov dh,line ; Строкаmov dl,column ; Столбецint 10h ; Прерывание BIOS

  49. mov ah,0ah ; Функция вывода символаmov al,sym ; Символmov bh,0 ; Видеостраницаmov cx,60 ; Количество повторенийint 10h inc syminc atrbinc linecmp line,23jl m2mov line,1 m2: mov ah,8 ; Функция ввода символа без эхаint 21h ; воспринимает Ctrl/cjmp m1 main endpend mainРезультат:

More Related