КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Возврат результата из процедуры
Ret6 Pop bp Add bx,ax Mov bp,sp Push bp Фрагмент модуля 2 End main Codesg ends Main endp Mov ax,4c00h Call far ptr submul Push dat3 Push dat2 Push dat1 Mov ds, ax Mov ax, datasg Main proc far Codesg segment para public Datasg ends Dat3 dw 5h Dat2 dw 2h Dat1 dw 10h Stk ends Stk segment para stack Extrn submul far Передача параметров в дальнюю процедуру через стек End Code ends Put endp Ret Put proc far Code segment Comdata ends PUBLIC put Модуль 2 End main Code ends Int21h Mov dx, offset buf Mov ah,9 Call put Mov ds, ax Mov ax, comdata Main Code segment Comdata ends Модуль 1 Передача параметров в процедуру через общую память End main Count endp Ret Pop ax Pop cx Mov dx, si Mov ah, 9h Push cx Push ax Count proc near Main endp Mov ax, 4c00h Call count Mov ds,ax Main proc Code Data Передачи параметров в процедуру через регистры Seg2 ends Ret Add endp Mov res, al Add proc far Dseg2 ends End start Code ends ;модуль2 GLOBAL res:byte, add:far EXTRN fix:byte dseg2 segment 'data' res db? seg2 segment 'сode' ……. mov al, fix; fix в другом модуле …
Через регистры целесообразно передавать в ближнюю процедуру. Необходимо заботиться о том, чтобы применять те регистры, которые не используются при передаче управления. Процедура должна записать в стек содержимое регистров, которые будут использованы для передачи параметров, и в конце - восстановить их содержимое.
Пример. string db 'строка, $' mov ax,@data … lea si, string;загрузка регистра int 21h… int 21h … EXTRN put: far comdata segment common 'data' buf db ‘ $’; в буфере пробелы assume cs:code, ds:comdata int 21h mov ax,4c00h;выход comdata segment common 'data' buf db ‘ $’ assume cs:code, ds:comdata mov buf,’a’ mov buf+1,’s’ mov buf+2,’u’
Пример Модуль 1 dw 64 dup(?) datasg segment para ‘data’ assume cs:codesg, ds:datasg, ss:stk
int 21h mov ax,[bp+6] mov bx,[bp+8] mov cx,[bp+10] sp bp+6 bp+8 bp+10
Способы возврата: 1) Через свободный регистр. 2) С использованием общей памяти, когда объем передаваемой информации велик. Способ требует внимания программиста при чтении возвращаемых результатов. 3) Через стек. Программист резервирует некоторую область стека с целью возврата в этой области результата работы процедуры. На рисунке показан вариант резервирования стека для возврата двух параметров.
Дата добавления: 2014-01-04; Просмотров: 377; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |