Definição e Chamadas de Sub-Rotinas (funções e/ou procedimentos) Chamada: 1) Salvar na pilha os registradores que a sub-rotina "estraga" 2) Colocar na pilha os parâmetros em ordem reversa (padrão C) 3) Chamar a Sub-Rotina (instrução "call") OBS.: Caso todo o código será montado em um único segmento de código usar "call near" (empilha somente IP) caso contrário usar "call far" (empilha CS e IP) 4) Após a instrução "call" (retorno da Sub-Rotina) restabelecer o topo da pilha eliminando os parâmetros (lembrar que se há parâmetro de saída na pilha salva-lo na variável global pertinente) 5) Restaurar os registradores salvos no passo 1) Sub-Rotina: 1) Salvar BP na pilha 2) BP <- SP 3) Reservar espaço na pilha para as variáveis locais (sp <- sp - 2n, onde n é o número de variáveis locais de 16 bits) 4) Salvar os registradores que serão usados na Sub-Rotina) 5) Código da Sub-Rotina 6) Restaurar os registradores salvos em 4) 7) Restabelecer o topo da pilha eliminando as variáveis locais 8) Restaurar o registrador BP 9) Retornar ao ponto de chamada. OBS.: O acesso aos parâmetros são realizados com endereços de memória da forma [BP + n] e às variáveis locais [BP - n] onde o valor de "n" depende da posição do parâmetro/variável local e se a chamada foi feita com "NEAR" ou "FAR". Exemplo: Seja a função myfunc com 3 parâmetros p1, p2 e p3 e que utilize 2 variáveis locais v1 e v2, onde pn são posições de memória no segmento de dados definimos a partir da diretiva DW. P3 é o parâmetro de saída e a sub-rotina salva todos os registradores que usa. Os parâmetros p1 e p2 são passados por valor e p3 por referência. Trecho de código na chamada: .... .... push p3 ; empilha o 3o. parâmetro (saída) - endereço ; de p3 que é passado por referência push [p2] ; empilha o valor do 2o. parâmetro push [p1] ; empilha o valor do 1o. parâmetro call myfunc Add sp, 6 ; coloca como topo da pilha o parâmetro de saída .... .... Trecho de código na função: myfunc: push bp ; salva bp para preservar seu valor no local ; da chamada mov bp,sp ; BP passa a ser referência para acesso aos ; parâmetros e variáveis locais sub sp,4 ; reserva, na pilha, espaço para as variáveis ; locais push ax ; salva os push bx ; registradores push cx ; usados na sub-rotina push di ; di será usado para fazer acesso ao parâmetro ; de saída (por referência) .... .... mov bx,[bp+4] ; coloca o valor do 1o. parâmetro em bx mov ax,[bp+6] ; coloca o valor do 2o. parâmetro em ax mov di,[bp+8] ; coloca em di endereço do parâmetro de saída mov [bp-2],2 ; inicializa a variável local v1 .... .... mov [bx],cx ; parâmetro de saída recebe valor calculado ; na sub-rotina pop di pop cx pop bx pop ax mov sp,bp pop bp ret