Prog Segment Para Public

PROG SEGMENT PARA PUBLIC 'CODE'(Primos) ASSUME cs:PROG,ss:PROG,ds:PROG ORG 0100h programa: jmp codigo cont2 DB 0 n DB 0

Views 243 Downloads 72 File size 302KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

PROG SEGMENT PARA PUBLIC 'CODE'(Primos) ASSUME cs:PROG,ss:PROG,ds:PROG ORG 0100h programa: jmp codigo cont2 DB 0 n DB 0 num DW 0 ind DW 1 cont DW 0 divi DB 0 cad DB 7 dup(0) enun DB 'Introduzca el valor de n: $' res DB 10,13,'Numeros primos hasta $' codigo: mov dx,OFFSET enun mov ah,09h int 21h mov ah,01h mov bx,OFFSET cad mov n,0 mov cx,4 bucle1: int 21h mov [bx],al cmp al,13 jz listo inc bx inc n loop bucle1 listo: mov al,10 mov [bx],al mov al,13 mov [bx+1],al mov al,36 mov [bx+2],al cmp n,0 jz codigo mov dx,OFFSET res mov ah,09h int 21h mov dx,OFFSET cad int 21h mov al,[bx-1] sub al,48 xor ah,ah add num,ax cmp n,1 jz bucle2 mov al,[bx-2] sub al,48 mov cl,10 mul cl add num,ax cmp n,2 jz bucle2 mov al,[bx-3] sub al,48 mov cl,100 mul cl add num,ax cmp n,3 jz bucle2 mov al,[bx-4] sub al,48 xor ah,ah

mov cx,1000 mul cx add num,ax bucle2: mov divi,0 mov cont,1 bucle3: mov ax,ind xor dx,dx mov cx,cont div cx cmp dx,0 jnz no_eq inc divi no_eq: inc cont mov ax,ind shr ax,1 cmp cont,ax jnbe fin3 jmp bucle3 fin3: cmp divi,1 jnbe mayor mov ax,ind call funcion inc cont2 cmp cont2,20 jnz mayor mov ah,00h int 16h mov cont2,0 mayor: inc ind mov ax,ind cmp ax,num jnbe fin2 jmp bucle2 fin2: mov ah,00h int 16h mov ah,4ch mov al,00h int 21h funcion PROC NEAR xor dx,dx mov cx,1000 div cx mov cad,al mov ax,dx mov cl,100 div cl mov cad+1,al mov al,ah xor ah,ah mov cl,10 div cl mov cad+2,al mov cad+3,ah mov cad+4,10 mov cad+5,13 mov cad+6,36 add cad,48 add cad+1,48 add cad+2,48 add cad+3,48 mov dx,OFFSET cad

mov ah,09h int 21h RET funcion ENDP PROG ENDS END programa %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DATOS SEGMENT %%fatorial RES DW 1 DIEZ DW 10 MENSAJE DB "Ingrese número (1-8) : $" LINEA_FACTOR DB 13,10,"El factorial es : $" ERROR_INGRESO DB 13,10,"Ingrese un numero del 1 al 8 solamente $" CADENANUM DB 4 DUP(?) CADENARES DB 10 DUP(?) DATOS ENDS ; PILA SEGMENT STACK DB 252 DUP(?) PILA ENDS ;CODIGO SEGMENT ASSUME CS:CODIGO, DS:DATOS, SS:PILA INICIO: MOV AX,DATOS MOV DS,AX MOV DX,OFFSET MENSAJE ;IMPRIMIR MENSAJE MOV AH,9 INT 21H; MOV DX,OFFSET CADENANUM ;LEE CADENA NUMERICA MOV SI,DX MOV BYTE PTR[SI],2 ; UN SOLO DIGITO MOV AH,0AH INT 21H SUB CH,CH ; HACER CH = 0 MOV CL,[SI+2] ; CARACTER DE DIGITO A NUMERO SUB CL,"0" ; CX CONTIENE NUMERO CMP CL,9 JE ERRORNUMERO ; CALL FACTORIAL ; LLAMA AL PROCEDIMIENTO FACTORIAL ; EL VALOR DEL FACTORIAL ESTA EN LA VARIABLE RES ; ; ; INICIO DE CONVIERTE NUMERO A CADENA MOV CX,0 ; CONTADOR DE NUMERO DE DIGITOS SALVADOS EN LA PILA MOV AX,RES ; NUMERO A CONVERTIR EN CADENA OTRO: MOV DX,0 ; DIV DIEZ ; PARA DIVISION DE 16 BITS ; DL = RESTO DE DIVISION ES ULTIMO DIGITO ADD DL,"0" ; Y DEBE SER CONVERTIDO A CARACTER PUSH DX ; SALVARLO EN LA PILA INC CX ; AUMENTAR CONTADOR CMP AX,0 ; COMPROBAR SI YA SE REDUJO A CERO JNE OTRO LISTO1: MOV DX,OFFSET CADENARES ; PASAR LOS DIGITOS DE LA PILA A CADENARES MOV SI,DX

OTRO1: CMP CX,0 ; COMPROBAR SI LA PILA CONTIENE DIGITOS JE LISTO2 POP AX ; OBTENER DIGITO DE LA PILA

MOV [SI],AL ; Y PASARLO A DS:SI INC SI ; A LA SIGUIENTE POSICION EN CADENARES DEC CX ; DISMINUIR CONTADOR JMP OTRO1

LISTO2: MOV BYTE PTR [SI],"$" ; FIN DE CONVIERTE NUMERO A CADENA ; MOV DX, OFFSET LINEA_FACTOR MOV AH,9 INT 21H MOV DX, OFFSET CADENARES ; IMPRIMIR CADENA DE RESULTADO MOV AH,9 INT 21H JMP FIN ERRORNUMERO: MOV DX, OFFSET ERROR_INGRESO MOV AH,9 INT 21H

FIN: MOV AH,4CH SUB AL,AL INT 21H ; FACTORIAL PROC NEAR CMP CX,1 JE FINPROC PUSH CX ; SI CX ES MAYOR QUE 1, SALVAR SU VALOR ACTUAL DEC CX ; Y CALCULAR FACTORIAL DE CX-1 CALL FACTORIAL MOV AX,RES ; RES CONTIENE FACTORIAL DE CX-1 POP CX ; RESTAURAR VALOR ACTUAL DE CX MUL CX ; Y HALLAR EN AX NUEVO VALOR DE FACTORIAL=CX*RES MOV RES,AX ; ACTUALIZAR RES FINPROC: RET FACTORIAL ENDP ; CODIGO ENDS ; END INICIO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%55 Diagon atos segment ; segmento de datos aux db ? i db 1 j db 1 max db 25 long db ? cadena db 25 dup (' '), '$' mens db 'introducir cadena:$' ; el $ indica el fin. linea db 13,10,13,10,13,10,13,10,'$' salida db 'Pulse una tecla para salir...$' datos ends

;---------------------------------------------------------------------------------pila

segment stack 'stack' ; segmento de pila dw 50h dup (?) ; reserva 2000 palabras de 16 bits, 4000 bytes pila ends ;----------------------------------------------------------------------------------codigo segment ; segmento de codigo assume cs:codigo,ds:datos,ss:pila inicio: call limpiar ; equivale a CLRSCR() de C mov ax,datos mov ds,ax xor si,si ; pongo SI a 0 lea dx,mens ; imprime mensaje en pantalla *** (printf) *** mov ah,09h int 21h lea dx,max ; lee la cadena desde teclado *** (scanf) *** mov ah,0ah int 21h LEA DX,LINEA ; imprime linea en blanco *** printf("\a") *** MOV AH,9 INT 21H ;call color ; pone color al texto *** textcolor *** lea bx,cadena mov si,bx SEGUIR: mov al,[si] mov bh,[si] mov aux,bh cmp al,0dh je SALIR mov ah,2h ; establece posicion de cursor *** gotoxy() *** mov bx,01h mov dh,i mov dl,i int 10h mov dl,aux ; en dl esta el valor e imprimir en pantalla MOV AH,02H ; imprime un caracter INT 21H inc si ; incrementa indice del puntero a cadena inc i ; incremento fila y columna inc j jmp SEGUIR SALIR: LEA DX,LINEA ; imprime linea en blanco *** printf("\a") MOV AH,9 INT 21H LEA DX,SALIDA ; despliega mensaje en pantalla *** printf *** MOV AH,9 INT 21H MOV AH,07H ; pulse una tecla... *** getch() *** INT 21H mov ax,4c00h ; sale a SO *** return 0 *** int 21h codigo ends end inicio

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%% .MODEL SMALL%%%min a mayuscula .STACK 100h .DATA LECTURA DB 20 TAM DB 0 CADENA DB 20 DUP(' ') MSJ2 DB 13,10,'CADENA EN MAYUSCULAS: ' MAYUS DB 20 DUP('$') MSJ1 DB 'Ingrese Cadena: $' .CODE INICIO: MOV AX,@DATA MOV DS,AX ;pide cadena LEA DX,MSJ1 MOV AH,09 INT 21h ;permite ingreso de cadena LEA DX,LECTURA MOV AH,0Ah INT 21h ;guarda cantidad de caracteres leidos LEA SI,TAM MOV CL,[SI] ;coloco indices en el principio de ambas cadenas LEA SI,CADENA LEA DI,MAYUS CICLO: MOV AL,'a' CMP [SI],AL JAE ISMIN ;si es >= que 'a' salta a ISMIN para verificar que sea minuscula MOV AL,[SI] ;sino mueve el caracter tal como esta MOV [DI],AL JMP SIG ;salta a SIG ISMIN: MOV AL,7Ah CMP [SI],AL JBE CONVER ;si es