Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ;
  2. ;
  3. ; -----------------------------------------
  4. ;
  5. ; Verificador de cpf
  6. ; Ricardo, Neimar e Gabriel
  7. ; -----------------------------------------
  8. ;
  9. ;
  10.  
  11.  
  12. name "Cpf verificador"
  13. org 100h                                                  
  14.                                                            
  15. novo_cpf:                                                  
  16. call PularLinha                                            
  17.                                                            
  18. mov si, 0                                                
  19. mov bl, 1                                                        
  20. mov ah, 09h                                                
  21. mov dx, offset pergunta                                    
  22. int 21h                                                    
  23.                                                            
  24. ler:                                                      
  25.     mov ah, 01h                                            
  26.     int 21h                                                
  27.     cmp al, 8                                              
  28.     jz escreva_vazio                                      
  29.                                                            
  30.     mov [vetor+si], al                                    
  31.     inc si                                                
  32.     inc bl
  33.     cmp si, 11                                            
  34.     jl ler                                                
  35.     jmp continua                                          
  36.                                                            
  37. escreva_vazio:                                            
  38.     mov     AL, ' '                                        
  39.     mov     AH, 0Eh                                        
  40.     int     10h                                            
  41.     cmp bl, 1
  42.     jz ler
  43.        
  44.     mov     AL, 8                                          
  45.     mov     AH, 0Eh                                        
  46.     int     10h                                            
  47.     cmp si, 0                                              
  48.     jnz decrementa_si                                      
  49.    
  50.     jmp ler                                                
  51.                                                            
  52. decrementa_si:                                            
  53.     dec bl
  54.     dec si                                                
  55.     jmp ler                                                
  56.                                                            
  57. continua:                                                  
  58.     mov si, 0                                              
  59.                                                            
  60.     call PularLinha                                        
  61.                                                            
  62.     mov ah, 09h                                            
  63.     mov dx, offset imprimi_letra                          
  64.     int 21h                                                
  65.                                                            
  66. imprimir:                                                  
  67.     mov ah, 02h                                            
  68.     mov dl, [vetor+si]                                    
  69.     int 21h                                                
  70.                                                            
  71.     inc si                                                
  72.     cmp si, 11                                            
  73. jl imprimir                                                
  74.  
  75. lea bx, vetor
  76.  
  77. call PularLinha                                            
  78. call VerificaCPF                                          
  79.  
  80. mov ah,0Ch  ; Esvazia o buff
  81. mov al,0    
  82. int 21h    
  83.  
  84.  
  85.  
  86. cmp valor, 0                                              
  87. jz invalido                                                
  88.                                                            
  89. cmp valor, 1                                              
  90. jz valido                                                  
  91.                                                            
  92. invalido:                                                  
  93.     mov ah, 09h                                            
  94.     mov dx, offset cpf_invalido                            
  95.     int 21h                                                
  96.     jmp pergunta_dnv                                      
  97. valido:                                                    
  98.     mov ah, 09h                                            
  99.     mov dx, offset cpf_valido                              
  100.     int 21h                                                
  101. ; Prende o usuario caso ele nao digite s ou n              
  102.                                                            
  103. pergunta_dnv:                                              
  104.     call PularLinha                                        
  105.     mov ah, 09h                                            
  106.     mov dx, offset pergunta_2                              
  107.     int 21h                                                
  108.                                                            
  109.     mov ah, 01h                                            
  110.     int 21h                                                
  111.     cmp al, 's'                                            
  112.     jz novo_cpf                                            
  113.     cmp al, 'n'                                            
  114.     jz sair                                                
  115.     jnz pergunta_dnv                                      
  116.  
  117.  
  118. sair:
  119.     mov ah, 0 ; Espera uma tecla ser precionada para sair
  120.     int 16h        
  121.  
  122. ret;
  123. ;declaracao de variaveis        
  124. ;
  125. ;
  126.     vetor db 11 dup (?)
  127.     cpf_valido db "O cpf e valido. $"
  128.     cpf_invalido db "O cpf e invalido. $"
  129.     resultado_texto db "Resultado 1 digito: $"
  130.     soma_texto db "Soma: $"
  131.     valor_texto db "Valor: $"
  132.     pergunta_2 db "Voce quer verificar outro cpf? digite 's' ou 'n': $"
  133.     pergunta db "Insira um CPF para ser validado: $"
  134.     imprimi_letra db "O CPF que foi inserido eh: $"
  135.     caracter_vazio db 13, 10, "$"
  136.     contador dw ?
  137.     soma dw ?
  138.     i dw ?    
  139.     valor dw ?
  140.     resultado dw ?
  141.     resultado_1 dw ?
  142.     resultado_2 dw ?
  143.  
  144. ; Procedimento para Verificar o primeiro digito do CPF
  145. ; Este procedimento tem como objetivo verificar os digitos de um CPF, realizar
  146. ; a conta necessaria e retornar a variavel valor como 0 se o CPF for invalido
  147. ; e a um se for valido
  148.  
  149. VerificaCPF PROC  
  150.     ; reseta para que possa ser usado novamente      
  151.     mov ax, 0
  152.     mov cx, 0
  153.     mov dx, 0
  154.     mov soma, 0
  155.     mov resultado, 0
  156.     mov valor, 0
  157.     mov resultado_1, 0
  158.     mov resultado_2, 0
  159.    
  160.     mov i, 10 ; Inicializando a variavel contador
  161.     mov si, 0 ; Inicializando a variavel soma como 0
  162.    
  163.     loop_soma_1:    
  164.         mov al, [bx+si]      ;
  165.         sub al, 30h                  ; '1' - '0' = 1
  166.        
  167.         mov cl, b.i
  168.        
  169.         mul cl
  170.         add soma, ax
  171.        
  172.         inc si
  173.         dec i
  174.        
  175.         cmp si, 9
  176.     jl loop_soma_1
  177.        
  178.     mov ax, soma
  179.     mov cl, 11
  180.     div cl
  181.     mov b.valor, al
  182.     mov al, b.valor
  183.     mov cl, 11
  184.     mul cl
  185.     mov valor, ax
  186.    
  187.     mov ax, soma
  188.     sub ax, valor
  189.     mov resultado, ax ; RESULTADO
  190.    
  191.     cmp resultado, 0
  192.     jz resultado_zero
  193.    
  194.     cmp resultado, 1
  195.     jz resultado_um
  196.        
  197.     mov ax, 11
  198.     sub ax, resultado
  199.     mov resultado, ax    
  200.     mov resultado_1, ax
  201.     jmp continuacao
  202.        
  203.     resultado_zero:
  204.     mov resultado_1, 0
  205.     jmp continuacao
  206.    
  207.     resultado_um:
  208.     mov resultado_1, 0
  209.     jmp continuacao
  210.    
  211.    
  212.     continuacao:    
  213.                
  214.     mov ax, 0
  215.     mov cx, 0
  216.     mov dx, 0
  217.     mov soma, 0
  218.     mov valor, 0
  219.     mov resultado, 0
  220.      
  221.     mov i, 11 ; Inicializando a variavel contador
  222.     mov si, 0 ; Inicializando a variavel soma como 1
  223.     loop_soma_2:
  224.    
  225.         mov al, [bx+si]      ;
  226.         sub al, 30h                  ; '1' - '0' = 1
  227.        
  228.         mov cl, b.i
  229.        
  230.         mul cl
  231.         add soma, ax
  232.        
  233.         inc si
  234.         dec i
  235.            
  236.         cmp si, 9
  237.     jl loop_soma_2
  238.    
  239.     mov al, b.resultado_1
  240.     mov cl, 2
  241.     mul cl
  242.    
  243.    
  244.     add soma, ax    
  245.    
  246.     mov ax, soma
  247.     mov cl, 11
  248.     div cl
  249.     mov b.valor, al
  250.     mov al, b.valor
  251.     mov cl, 11
  252.     mul cl
  253.     mov valor, ax
  254.    
  255.     mov ax, soma
  256.     sub ax, valor
  257.     mov resultado, ax ; RESULTADO
  258.    
  259.     ; Resultado
  260.     cmp resultado, 0
  261.     jz resultado_zero_2
  262.    
  263.     cmp resultado, 1
  264.     jz resultado_um_2
  265.        
  266.     mov ax, 11
  267.     sub ax, resultado
  268.     mov resultado, ax    
  269.     mov resultado_2, ax
  270.     jmp continuacao_2
  271.        
  272.     resultado_zero_2:
  273.     mov resultado_2, 0
  274.     jmp continuacao_2
  275.    
  276.     resultado_um_2:
  277.     mov resultado_2, 0
  278.     jmp continuacao_2
  279.    
  280.    
  281.     continuacao_2:  ; Mensagem de CPF certo ou errado    
  282.                
  283.     mov al, vetor[9]      
  284.     sub al, 30h            
  285.        
  286.     cmp b.resultado_1, al
  287.     jz primeiro_igual
  288.     jnz msg_cpf_invalido
  289.    
  290.     primeiro_igual:
  291.     mov al, vetor[10]      
  292.     sub al, 30h            
  293.        
  294.     cmp b.resultado_2, al
  295.     jz segundo_igual
  296.     jnz msg_cpf_invalido
  297.    
  298.     segundo_igual:
  299.     mov valor, 1
  300.     jmp fim
  301.    
  302.     msg_cpf_invalido:
  303.     mov valor, 0
  304.      
  305.     fim:
  306.     ret
  307.  
  308. VerificaCPF ENDP
  309.  
  310. ; Procedimento para pular uma linha
  311. ; Tem como objetivo pular uma linha
  312. PularLinha PROC
  313.     mov ah, 09h
  314.     mov dx, offset caracter_vazio
  315.     int 21h
  316.     ret
  317. PularLinha ENDM
  318.  
  319.  
  320. ; Printar numeros
  321. ; Tem como objetivo printar um unico numero,
  322. ; caso ele possua mais de um digito ele chama outro
  323. ; procedimento chamado print_num_uns
  324. print_num       PROC    NEAR
  325.         PUSH    DX
  326.         PUSH    AX
  327.  
  328.         CMP     AX, 0
  329.         JNZ     not_zero
  330.  
  331.         MOV     AL, '0'
  332.         MOV     AH, 0Eh
  333.         INT     10h  
  334.         JMP     printed
  335.  
  336. not_zero:
  337.         ; the check SIGN of AX,
  338.         ; make absolute if it's negative:
  339.         CMP     AX, 0
  340.         JNS     positive
  341.         NEG     AX
  342.  
  343.         MOV     AL, '-'
  344.         MOV     AH, 0Eh
  345.         INT     10h  
  346.  
  347. positive:
  348.         CALL    PRINT_NUM_UNS
  349. printed:
  350.         POP     AX
  351.         POP     DX
  352.         RET
  353. print_num       ENDP
  354.  
  355. PRINT_NUM_UNS   PROC    NEAR
  356.         PUSH    AX
  357.         PUSH    BX
  358.         PUSH    CX
  359.         PUSH    DX
  360.  
  361.         ; flag to prevent printing zeros before number:
  362.         MOV     CX, 1
  363.  
  364.         ; (result of "/ 10000" is always less or equal to 9).
  365.         MOV     BX, 10000       ; 2710h - divider.
  366.  
  367.         ; AX is zero?
  368.         CMP     AX, 0
  369.         JZ      print_zero
  370.  
  371. begin_print:
  372.  
  373.         ; check divider (if zero go to end_print):
  374.         CMP     BX,0
  375.         JZ      end_print
  376.  
  377.         ; avoid printing zeros before number:
  378.         CMP     CX, 0
  379.         JE      calc
  380.         ; if AX<BX then result of DIV will be zero:
  381.         CMP     AX, BX
  382.         JB      skip
  383. calc:
  384.         MOV     CX, 0   ; set flag.
  385.  
  386.         MOV     DX, 0
  387.         DIV     BX      ; AX = DX:AX / BX   (DX=remainder).
  388.  
  389.         ; print last digit
  390.         ; AH is always ZERO, so it's ignored
  391.         ADD     AL, 30h    ; convert to ASCII code.
  392.         MOV     AH, 0Eh
  393.         INT     10h    
  394.  
  395.  
  396.         MOV     AX, DX  ; get remainder from last div.
  397.  
  398. skip:
  399.         ; calculate BX=BX/10
  400.         PUSH    AX
  401.         MOV     DX, 0
  402.         MOV     AX, BX
  403.         DIV     CS:ten  ; AX = DX:AX / 10   (DX=remainder).
  404.         MOV     BX, AX
  405.         POP     AX
  406.  
  407.         JMP     begin_print
  408.        
  409. print_zero:
  410.         MOV     AL, '0'
  411.         MOV     AH, 0Eh
  412.         INT     10h    
  413.        
  414. end_print:
  415.  
  416.         POP     DX
  417.         POP     CX
  418.         POP     BX
  419.         POP     AX
  420.         RET
  421. PRINT_NUM_UNS   ENDP
  422. ten             DW      10      ; used as multiplier/divider by SCAN_NUM & print_num.