Инструменты пользователя

Инструменты сайта


examination:asm:question23

Вопрос №23. Команды перехода с возвратом, организация работы с процедурами. Примеры

Процедура – группа команд для решения конкретной подзадачи.

Синтаксис процедуры:

имя_процедуры PROC [[модификатор_языка ] язык] [расстояние ]

команды

[имя_процедуры ] ENDP

Пример:

model small

.stack 100h

.data

.code

my_proc procnear

ret

my_proc endp

start:

end start

процедуру можно распологать в конце программы либо вкладывать в другую. Во втором случае неоходимо предусмотреть обход тела процедуры, ограниченного директивами PROC и ENDP, с помощью JMP/ Команда CALL осуществляет вызов процедуры (подпрограммы). Синтаксис команды: call [модификатор] имя_процедуры

Подобно команде JMP команда CALL передает управление по адресу с символическим именем имя_процедуры, но при этом в стеке сохраняется адрес возврата (то есть адрес команды, следующей после команды CALL). Команда RET считывает адрес возврата из стека и загружает его в регистры CS и EIP/IP, тем самым возвращая управление на команду, следующую в программе за командой CALL Синтаксис команды: ret [число] Необязательный параметр [число] обозначает количество элементов, удаляемых из стека при возврате из процедуры.

Как и в случае команды JMP, вызов процедуры командой CALL может быть внутрисегментным и межсегментным. С директивой PROC используются еще несколько директив: ARG, RETURNS, LOCAL, USES. Их назначение — помочь программисту выполнить некоторые рутинные действия при вызове и возврате из процедуры (заодно и повысив надежность кода). Директивы ARG и RETURNS назначают входным и выходным параметрам процедуры, передаваемым через стек, символические имена. Директива USES в качестве параметров содержит имена используемых в процедуре регистров.

например

je перейти если равно

jne если не равно

jbe если меньше или равно

и так далее

пример (фрагмент обнуляет pole_m)

.data

n equ 50

pole_m db

.code

n dup (?)

xor bx.bx ;bx=0

m1: mov mem[bx],0

inc bx

cmp bx,n

jne m1

exit

Команды PUSH, PUSHF, CALL, INT, и INTO заносят в стек адрес возврата или содержимое флагового регистра. Команды POP, POPF, RET и IRET извлекают эти aдреса или флаги из стека.

Типичная организация многопроцедурной программы

CODESG SEGMENT PARA

BEGIN PROC FAR

 
 ...
 
 ... 

 CALL     B10  
                             
 CALL     C10
   
 RET 
             
 BEGIN   ENDP
  
 B10     PROC     NEAR
   
 ...
   
 ...
   
 RET 
      
 B10     ENDP  
      
 C10     PROC     NEAR
      
 ... 
     
 ...
      
 RET
      
 C10     ENDP 
      
 CODESG  ENDS     
      
 END      BEGIN  
examination/asm/question23.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)