Sei sulla pagina 1di 4

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 nmero (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 <= que 'z' es minuscula: salta a
CONVER
MOV AL,[SI] ;sino mueve el caracter tal como esta
MOV [DI],AL
JMP SIG ;salta a SIG
CONVER: MOV AL,[SI]
SUB AL,20h
MOV [DI],AL
JMP SIG
CONVER2:
MOV AL,[SI]
ADD AL,01
MOV [DI],AL
SIG: INC SI
INC DI
LOOP CICLO
LEA DX,MSJ2
MOV AH,09
INT 21h
MOV AH,4Ch
INT 21h
END INICIO

%%%%%%%%%%%%%%%%%%%%%%%Primo 2
Datos
segment
num
dw 4h
mensaje1 db "es primo", 0ah,0dh,"$"
mensaje2 db "no es primo",0ah,0dh,"$"
datos ends
programa segment
assume cs:programa, ds:datos
comienzo: mov ax,datos
mov ds,ax
mov bx,02h
siguiente: cmp bx,num
je primo
; Num es primo si BX=NUM
mov dx,0h
; poner NUMERO en DX AX, para
DX=0
mov ax,num
div bx
;divisin de 16bits, resto en DX
cmp dx,0h
je no_primo
; si resto es cero: saltar a NO_PRIMO
inc bx
jmp siguiente
;volver a probar el siguiente
primo:

mov dx,offset mensaje1 ; imprime mensaje1


mov ah,09h
int 21h
jmp fin

no_primo: mov dx,offset mensaje2 ; imprime mensaje2


mov ah,09h
int 21h
fin:

mov ah,4ch ; fin de proceso


int 21h

programa ends

end comienzo
$%%%%%%%%%%%%%%%%%%%%%%%%%%%
Efectuarla suma de dos numeros de 24
bits y almacenar el resultado a partir de
la direcci_on de memoria 0426H.
Considerando que los bits menos signi_cativos de los n_umeros empiezan en las localidades
0420h y 0423h, se tendr_a
.model small
.stack 64
.data
.code
suma: mov al,[420]
add al,[423]
mov [426],al
mov al,[421]
adc al,[424]
mov [427], al
mov al,[422]
adc al,[425]
mov [428],al
ret
end

Determinar el elemento m_as peque~no de


un bloque de datos. La longitud de bloque
esta en la direcci_on 2001H y el bloque
inicia en la direcci_on 2002H.
Considerando: que se almacena el resultado
en la localidad 2000 y n_umeros sin signo, se
tendr_a.
.model small
.stack 64
.data
.code
inicio: mov di,2002
mov al,[di]
mov cl,[2001]
mov ch,0
x: inc di
cmp al,[di]
jb y ;jl para n\'{u}meros
con signo
mov al,[di]
y: loop x
mov [2000],al
end

Potrebbero piacerti anche