Aqui está um exemplo de programa em linguagem assembly (sintaxe NASM) para calcular o fatorial de um determinado número:
```
PEDAÇOS 16
; Defina o segmento de dados
SEGMENTO DE DADOS
número:DW ?; O número para encontrar o fatorial de
; Defina o segmento de código
SEGMENTO DE CÓDIGO
começar:
mov machado, DADOS; Carregue o registro DS com o endereço do segmento de dados
mov dx, num; Carregue o número no DX
cmp dx, 0; Verifique se o número é 0
eu sou zero; Se sim, pule para o rótulo “zero”
movimento cx, 1; Inicialize o fatorial (CX) para 1
; Inicie o loop de cálculo fatorial
laço:
imulcx; Multiplique CX pelo número atual em DX
inc dx; Aumentar o número atual
cmp dx, num; Compare DX com o número original
loop jb; Se DX for menor que o número, volte para o loop
; Exibir o fatorial
zero:
mov ah, 4Ch; AH =4Ch para a interrupção "Print string" do DOS
lea dx, str_result; Carregue o endereço da string "resultado" no DX
interna 21h; Chame a interrupção 21h do DOS para exibir a string
ret; Retorne ao sistema operacional
; Defina a string "resultado"
str_result:DB "O fatorial é:$"
; Fim do programa
FIM início
; Defina o segmento da pilha
SEGMENTO DE PILHA
; Defina os dados para a pilha
DW 0
Extremidades da pilha
```
Explicação do programa:
1. Segmento de dados:
- `num:` define uma variável de palavra (16 bits) chamada `num` no segmento de dados. Esta variável armazenará o número para o qual queremos encontrar o fatorial.
2. Segmento de código:
- `start:` é o ponto de entrada do programa.
3. Inicialização:
- `mov ax, DATA`:Carrega o endereço do segmento de dados no registrador AX.
- `mov dx, num`:Carrega o valor de `num` no registrador DX.
4. Verifique se há zero:
- `cmp dx, 0`:Compara o valor em DX com 0.
- `je zero`:Se DX for igual a 0, salte para o rótulo `zero`.
5. Ciclo de cálculo fatorial:
- `loop`:
- `imul cx`:Multiplica o valor atual em CX pelo número atual em DX.
- `inc dx`:Incrementa o valor em DX.
- `cmp dx, num`:Compara DX com o número original.
- `jb loop`:Se DX for menor que o número, volta para o rótulo `loop` para continuar o cálculo.
6. Exiba o fatorial:
- `zero:` (Rótulo)
- `mov ah, 4Ch`:Define AH para 4Ch, que é a interrupção do DOS para imprimir uma string.
- `lea dx, str_result`:Carrega o endereço da string "resultado" no DX.
- `int 21h`:Chama a interrupção 21h do DOS para exibir a string.
7. Retorno:
- `ret`:Retorna ao sistema operacional.
8. Segmento de pilha:
- O segmento da pilha é definido com tamanho de uma palavra dupla (2 bytes) e inicializado com 0.
Nota:Este programa utiliza o sistema operacional DOS para impressão do resultado, portanto só funcionará em ambiente DOS ou em emulador que suporte DOS.