
APNDICE H - comando asm

  Uma grande novidade que ficou disponvel a partir da verso 6.0 do
Turbo,  a possiblidade de se escrever diretamente as intrues da
linguagem Assembler no Turbo, para isto, basta utilizarmos o comando ASM
e terminarmos a declarao com END.
 Sintaxe:
ASM
  SENTENA_ASM < Separador>
END.
  Onde a sentea_asm pode ser qualquer sentena assembler. 
  E separador, uma nova linha, ponto-e-vrgula ";" ou comentrios do
Turbo "{}" ou "(**)".
  Podemos usar mais de um comando "asm" na mesma linha, separando-os por
";". E completados por END.
  Uma sentena_asm:
[label:] <prefix> [opcode[operand<,operand>]]
  Onde label  definido da seguinte forma:
label um  identificador:
  Um label local pode ser aquele que escrito dentro de uma sentena_asm
 definido como segue:
label local:
- comea com o caractere arroba @;
- so seguidos de um ou mais caracteres podendo ser estes:
  letras (a..z)
  dgitos (0..9)
  sublinhado (_)
  arroba (@)
- e terminados com dois_pontos (:)
Prefix:
  Prefix  o prefixo de um cdigo de operao. So disponveis os
seguintes prefixos:
opcode      o que faz
LOCK        trava o bus
REP         repete uma operao com string
REPE        repete enquanto igual
REPZ        repete enquanto zero
REPNE       repete enquanto diferente
REPNZ       repete enquanto diferente de zero
SEGCS       CS (segmento de cdigo) ignorado
SEGDS       DS (segmento de dados) ignorado
SEGES       ES (segmento extra) ignorado
SEGSS       SS (segmento de stack) ignorado

OPERAND:
  So expresses feitas de combinaes entre constantes, registradores,
smbolos e operadores.
  Basicamente, as expresses so construdas da mesma forma como no
Pascal, porm existem algumas diferenas importantes:
  Existe um conjunto prprio de palavras reservadas;
  Os valores da expresses so de 32 bits;
  As referncias s variveis so efetuadas pelo endereo, enquanto no
Turbo, so feitas pelo seu contedo.
  Palavras reservadas do asm:
AH    regitrador alto de 8 bits
AL    registrador baixo de 8 bits
AND   faz a operao lgica "E" entre dois operandos
AX    registrador de uso geral 16 bits
BH    registrador alto de 8 bits
BL    registrador baixo de 8 bits
BP    registrador de base
BX    registrador de uso geral 16 bits
BYTE  providncia um para o "TYPE" do Assembler
CH    registrador alto de 8 bits
CL    registrador baixo de 8 bits
CS    segmento de cdigo 16 bits
CX    registrador de uso geral 16 bits
DH    registrador alto de 8 bits
DI    indexador destino 16 bits
DL    registrador baixo de 8 bits
DS    segmento de dados 16 bits
DWORD providncia 2 para o "TYPE" do Assembler
DX    registrador de uso geral 16 bits
ES    segmento extra 16 bits
FAR   pseudotipo para procedimentos
      Exemplo: procedure longe; FAR;
HIGH  resulta a parte alta de uma WORD
LOW   resulta a parte baixa de uma WORD
MOD   resulta no mdulo de uma diviso
NEAR  pseudotipo para procedimentos
      Ex: PROCEDURE perto;NEAR;
NOT   operador lgico de negao
OFFSET  parte baixa de um segmnto
OR    operador lgico ou
PTR   operador de memria
QWORD providencia 8 bytes para o "TYPE" do Assembler
SEG   retorna a parte alta de um segmento
SHL   rotao  esquerda
SHR   rotao  direita
SI    indexador fonte 16 bits
SP    ponteiro da pilha 16 bits
SS    segmento da pilha 16 bits
ST    registrador de stack do 8087
TBYTE providencia 10 bytes para o "TYPE" do Assembler
TYPE  retorna o tamanho do operador
WORD  providencia 2 bytes para o "TYPE" do Assembler
XOR   operador lgico "ou exclusivo"

  Vejamos como fica um programa escrito diretamente em jAssembler
PROGRAM teste_asm;
BEGIN
  ASM
  MOV AH,2  ;
  MOV DL,07H ;
  INT 21H ;
END;  
END.
  O uso dos registradores
  Uma sentena_asm preserva os seguintes registradores:
- BP - SP - SS - DS - 
  E altera os seguintes frequentemente:
- AX - BX - CX - DX - SI - DI - ES - FLAGS
  Quando acrescentarmos em uma rotina a palavra ASSEMLER, podemos, ou
melhor, devemos iniciar a rotina com ASM. Veja o exemplo a seguir
PROGRAM teste_minscula;
VAR
  s : STRING;
FUNCTION minscula(s : STRING) : STRING;ASSE BLER;ASM
PUSH DS
CLD
LDS SI, s
LES DI, @result
LODSB
STOSB
XOR AH,AH
XCHG AX,AX
JCXZ @3
@1 : 
LODSB
CMP AL,
JB @2
CMP AL,Z
JA @ 2
ADD AL,20H
@2 : 
STOSB
LOOP @1
@3 :
POP DS
END;
BEGIN
  READLN(s);
s := minscula(s);
WRITELN(s);
END. 
