Многомодульные программы Процедуры: организация вызова и возврата. Много файловые программы. Передача аргументов и возврат результатов. Обработка прерываний.
Стандартные возможности языка Оператор CALLОператор RET
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP [IP] SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP [IP] SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP [IP] SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Nearprog … Nearprog proc Ret(Retn) IP SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Farprog … Farprog proc Ret(Retf) IP SP SS
Стандартные возможности языка Оператор CALLОператор RET Call Farprog … Farprog proc Ret(Retf) IP [IP] [CS] SP CS SS
Стандартные возможности языка Оператор CALLОператор RET Call Farprog … Farprog proc Ret(Retf) IP [IP] [CS] SP CS SS
Файл 1Файл 2.model small.data x db Print from subprog$.code Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end model small data E x db 'Print from subprog$' F 6D F code Main proc B8 0000smov E D8mov ds,ax E8 FFF8call subprog **Error** z1.asm(8) Undefined symbol: SUBPROG 11.exit B8 4C00 MOV AX,04C00h B CD 21 INT 21h 14000D Main endp 15 end main
Файл 1Файл 2.model small.data x db Print from subprog$ Extrn subprog:near.code Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end model small data E x db 'Print from subprog$' F 6D F code Main proc B8 0000smov E D8mov ds,ax E8 FFF8call subprog 11.exit B8 4C00 MOV AX,04C00h B CD 21 INT 21h 14000D Main endp 15 end main
Файл 1Файл 2.model small.data x db Print from subprog$.code Extrn subprog Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end model small stack code Subprog proc B4 09 mov ah, BA 0000 lea dx,x **Error** z2.asm(6) Undefined symbol: X CD 21 int 21h C3 ret Subprog endp 10 end
Файл 1Файл 2.model small.data x db Print from subprog$.code Extrn subprog Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256 Extrn x:byte.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end model small stack code Subprog proc B4 09 mov ah, BA 0000 lea dx,x CD 21 int 21h C3 ret Subprog endp 10 end Error: Undefined symbol SUBPROG in module Z1.ASM Error: Undefined symbol X in module Z2.ASM
Файл 1Файл 2.model small.data x db Print from subprog$ Extrn subprog:near.code Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256 Extrn x:byte.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end
Файл 1Файл 2.model small.data x db Print from subprog$ Extrn subprog:near Public x.code Mainproc mov mov ds,ax call subprog.exit 0 Mainendp endmain.model small.stack 256 Extrn x:byte Public subprog.code Subprogproc mov ah,9 lea dx,x int 21h ret Subprogendp end
Директивы управления областью видимости EXTRN имя:тип[, имя:тип, …] - определяет внешнее имя и его тип: byte, word, dword, pword, fword, qword и tbyte для переменной; near и far – для процедуры; abs – для константы. PUBLIC имя[, имя, …] - делает каждое имя доступным всем другим модулям программы
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push ax … Retn/Retf IP Arg_1 SP Push arg_1 Через регистры можно передать только ограниченное число параметров SS
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push ax … Retn/Retf IP Arg_n … Arg_1 SP Push arg_1 SS
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push ax … Retn/Retf IP [IP] Arg_n … Arg_1 SP Push arg_1 SS Agn_n equ [sp+2]
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push ax … Retn/Retf IP [ax] [IP] Arg_n … Arg_1 SS SP Push arg_1 Agn_n equ [sp+4]!!!
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Retn/Retf IP [IP] Arg_n … Arg_1 SS SP Push arg_1 Mov bp,sp
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Retn/Retf IP [bp] [IP] Arg_n … Arg_1 SS SP Push arg_1 Mov bp,sp
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Retn/Retf IP [bp] [IP] Arg_n … Arg_1 SS SP,BP Push arg_1 Mov bp,sp
Вызов процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Retn/Retf IP … [bp] [IP] Arg_n … Arg_1 SS BP Push arg_1 Mov bp,sp SP Arg_n equ [bp+4]
Возврат из процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Pop bp IP переменные [bp] [IP] Arg_n … Arg_1 SS BP Push arg_1 Mov bp,sp локальные SP Arg_n equ [bp+4] Mov sp,bp
Возврат из процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Pop bp IP [bp] [IP] Arg_n … Arg_1 SS SP,BP Push arg_1 Mov bp,sp Arg_n equ [bp+4] Mov sp,bp
Возврат из процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Pop bp IP [IP] Arg_n … Arg_1 SS SP Push arg_1 Mov bp,sp Mov sp,bp
Возврат из процедуры с параметрами, передаваемыми через стек … Push arg_n Call Prog … Prog proc Push bp … Pop bp IP [IP] Arg_n … Arg_1 SS SP Push arg_1 Mov bp,sp Mov sp,bp Эпилог процедуры: LEAVE Пролог процедуры: ENTER 0,0 К-во памяти под локальные переменные Уровень вложен- ности
Возврат из процедуры с параметрами, без очистки стека … Push arg_n Call Prog … Prog proc … Mov sp,bp Ret IP [IP] Arg_n … Arg_1 SS SP Push arg_1 Pop bp
Возврат из процедуры с параметрами, без очистки стека … Push arg_n Call Prog Add sp,2*n … Prog proc Mov sp,bp Ret IP Arg_n … Arg_1 SS SP Push arg_1 … Pop bp Очистку стека производит вызывающая программа
Возврат из процедуры с параметрами, с очисткой стека … Push arg_n Call Prog … Prog proc … Mov sp,bp Ret 2*n IP [IP] Arg_n … Arg_1 SS SP Push arg_1 Pop bp
Возврат из процедуры с параметрами, с очисткой стека … Push arg_n Call Prog … Prog proc … Mov sp,bp Ret 2*n IP SS SP Push arg_1 Pop bp
Пример.model small.code Public print_ASCIIZ print_ASCIIZ proc far pushbp movbp,sp pushax pushsi pushds ldssi,[bp+2] cld print_readchar: lodsb oral,al jzprint_done int29h jmp print_readchar print_done: mov [bp+2],si pop ds pop si pop ax pop bp ret print_ASCIIZendp end
Print String String.model small.stack 256 print macrotp,str ifidni, extr print_ASCIIZ:far callprint_ASCIIZ db'&str',0 else.err'Type error endif endm.code main proc mov mov ds,ax print STRING, print string,.exit0 mainendp endmain code main proc B8 0000s mov E D8 mov ds,ax 19 print STRING, E E8 0000ecall print_ASCIIZ db 'This ASCIIZ-line will be printed', print string, A 0E E8 0000ecall print_ASCIIZ E db 'This is second ASCIIZ line',0 35.exit B8 4C00 MOV AX,04C00h C CD 21 INT 21h 38004E main endp 39end main
Доступ к параметрам prog procnear enter0,0 arg_2 equ[bp+4] arg_1 equ[bp+6] progprocfar enter0,0 arg_2 equ[bp+6] agr_1 equ[bp+8] pusharg_1 pusharg_2 callprog pushresult pushagr_1 pusharg_2 callprog popresult progproc ARGa:word,b:word=SBA Returns s:word enter0,0 … leave retSBA progendp Место в стеке под результат Сохранение результата Имя и тип формального аргумента a equ [bp+4 или 6] Тип и имя результата s equ [bp+sba+4 или 6] Имя константы равной сумме размерностей типов аргументов
Пример.model small.stack data xdw5 ydw6 zdw?.code pr1proc ARG a:word,b:word=SBA Returns s:word enter0,0 movax,a addax,b movs,ax leave retsba pr1endp
mainproc movds,ax pushz pushx pushy callpr1 popz.exit 0 mainendp endmain
10000.model small stack data x dw y dw ???? z dw ? code pr1 proc 11 =0004 ARG a:word,b:word=SBA Returns s:word C enter 0, B mov ax,a add ax,b 15000A mov s,ax 16000D C9 leave 17000E C ret sba pr1 endp
main proc B8 0000s mov E D8 mov ds,ax FF r push z 25001A FF r push x 26001E FF r push y E8 FFDB call pr F r pop z exit B8 4C00 MOV AX,04C00h C CD 21 INT 21h 33002E main endp 34 end main
Таблица описанных имен 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
Обработка прерываний Внешние прерывания – запросы поступившие от внешних устройств. Внутренние прерывания – инициализируются процессором как реакция на программные ошибки или прерывания пользователя (int). Flags [CS] [IP] … SP ? ? CS IP Таблица векторов прерываний
НомерОписаниеНомерОписание 00HДеление на ноль14HПрерывание сериального порта 01HПошаговое выполнение16HВвод с клавиатуры 02HНемаскируемое прерывание17HВывод на принтер 03HТочка останова19HЧтение boot-сектора 04HПереполнение1AHЧтение и установка таймера 05HПечать экрана 1BH Контроль прерывания от клавиатуры 08HСистемный таймер 09HПрерывание клавиатуры1CHКонтроль прерывания таймера 0EHКонтроль дискеты1DHТаблица видео адресов 10HВидео прерывание1EHТаблица дисковых адресов 11HПроверка оборудования1FHАдреса ASCII символов 12HПроверка памяти21HПрерывание DOS 13HВвод/вывод на диск33HПрерывание мышки Примеры прерываний
Структура таблицы векторов прерываний 60h÷66h – свободны [IP][CS] [IP][CS] [IP][CS] c … 0 65h Адрес Номер вектора 003fc256
Структура таблицы векторов прерываний 60h÷66h – свободны movax,2565h ldsdx,ppop int21h [IP][CS] [IP][CS] [IP][CS] offsetppopsegppop c … 0 65h Адрес Номер вектора 003fc256 Указатель на программу пользователя обработки прерывания Номер функции DOS Номер прерывания
Пример.model small.stack 256.data linedb1 symdb01h atrbdb19h column=10.code new_65hproc movah,6; Функция задания окна moval,0; Режим создания окна movbh,atrb; Атрибут символов в окне movcx,0; Левый верхний угол movdx,2479h; Нижний правый угол int10h; Прерывание BIOS iret; Возврат из обработки прерывания new_65hendp
mainproc movds,ax movax,2565h; Функция заполнения вектора прерывания pushds leadx,new_65h; Смещение функции обработки прерывания pushds pushcs popds; Сегмент функции обработки прерывания int21h; Вызов DOS popds; Восстановление индекса сегмента данных m1:int65h; Вызов прерывания пользователя movah,2; Функция позиционирования курсора movbh,0; Видеостраница movdh,line; Строка movdl,column; Столбец int10h; Прерывание BIOS
movah,0ah; Функция вывода символа moval,sym; Символ movbh,0; Видеостраница movcx,60; Количество повторений int10h incsym incatrb incline cmpline,23 jlm2 movline,1 m2:movah,8; Функция ввода символа без эха int21h; воспринимает Ctrl/c jmpm1 mainendp endmainРезультат:Результат