SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: Sotrono en Sábado 21 de Agosto de 2004, 07:33
-
Hola como va?
Soy bastante novato con la programacion en ensamblador, estuve leyendo algunos textos y realize algunos programas muy basicos.
Que instrucciones me permiten escribir en pantalla algo o leer un dato ingresado por el teclado??
-
Para MS-DOS:
lo mas sencillo es usar las funciones de la int 21h
las funciones mas basicas:
AH = 01h: lee del teclado y guarda el Ascii en AL.
AH = 02h: escribe en pantalla el Ascii del contenido de DL.
AH = 09h: escribe en pantalla la cadena apuntada por DX, esta cadean debe terminar en '$'.
AH = 0Ah: lee del teclado a una cadena de longitud fija hasta que se pulse ENTER o se llegue al fina de la cadena. El primer elemento de la cadnea indica el tamaño de la cadena.
-
Para MS-DOS:
lo mas sencillo es usar las funciones de la int 21h
las funciones mas basicas:
AH = 01h: lee del teclado y guarda el Ascii en AL.
AH = 02h: escribe en pantalla el Ascii del contenido de DL.
AH = 09h: escribe en pantalla la cadena apuntada por DX, esta cadean debe terminar en '$'.
AH = 0Ah: lee del teclado a una cadena de longitud fija hasta que se pulse ENTER o se llegue al fina de la cadena. El primer elemento de la cadnea indica el tamaño de la cadena.
Disculpa, yo tambien son novato en el lenguaje ensamblador. Mi duda es similar a lo que pediste respecto a escribir en pantalla, solo que y quiero leer un caracter desde el teclado.
He hecho algunos pequeños programas en el TASM42 de escribir un caracter y repetirlo con un ciclo. Ahora necesito leer desde el teclado un carcter, Super_G te respondio citando las interrupciones del Int 21h , en la cual me seria util AH = 01h que es la que pide un valor desde el teclado, mi duda es con respecto a como se utiliza tal interrupcion.
La has utilizado? si es asi entonces puedes ayudarme, necesito saber como la utilizo en el programa.
O si no, podria ayudarme a contactar a Super_G, ya que el te respondio a tu pregunta y el podria ayudarme dandome algun ejemplo.
Gracias. :hola:
-
hola, te pongo un ejemplo
.model small
.stack 100h
.code
start:
;Aqui lees el caracter y se guarda en al
mov ah,01
int 21h
;movemos el caracter al registro dl para despues visualizarlo
mov dl,al
;visualizamos lo que hay en dl mediante la funcion 02 de la int 21h
mov ah,02
int 21
;leemos otro caracter para alcanzar a ver lo que hicimos
mov ah,01
int 21h
;salida del programa
mov ax,4c00h
int 21h
end start
-
Dennis te coloco aqui un programa que pide dos digitos desde teclado y muestra la suma resultante.
En este ejemplo se piden SOLO UN digito (puede ser un caracter si no fuera suma) a la vez, esto se hace usando la funcion 01h de Int 21h que menciona Super G. Si deseas introducir una palabra o una cadena de caracteres por teclado te recomiendo que uses la funcion 0Ah de int 21h, como ya se ha mencionado anteriormente.
Espero que te sirva.
;suma de dos digitos introducidos desde teclado
title suma.asm
pila segment para stack'stack'
db 64 dup('stack')
pila ends
datos segment para public 'data'
pide1 db 'escribe un numero','$'
pide2 db 'escribe otro numero','$'
resul db 'la suma es:','$'
n1 db ?
n2 bd ?
salto db 10,13,'$'
datos ends
codigo segment para pulic'code'
inicio proc near
assume ss:pila,ds:datos,cs:codigo
mov ax,datos
mov ds,ax
mostrar macro mssg
mov ah,09h
lea dx,mssg
int 21h
endm
mostrar pide1
mov ah,01h ;aqui se toma el valor desde el teclado
int 21h
sub al,30h ;con esta suma convertimos el Ascii a decimal
mov n1,al
xor al,al
mostrar salto
mostrar pide2
mov ah,01h ;aqui tomamos el segundo digito por el teclado
int 21h
sub al,30h
add n1,al
xor al,al
cmp n1,9d
ja dos_digit
jmp un_digit
dos_digit:
xor al,al
mov al,n1
mov bl,10d
sub al,bl
mov n1,1d
add n1,30h
mov n2,al
add n2,30h
mostrar salto
mostrar resul
mov ah,09h
lea dx,n1
int 21h
jmp salir
un_digit
add n1,30h
mostrar salto
mostrar resul
mov ah,09h
lea dx,n1
int 21h
salir:
mov ah,4ch
int 21h
inicio endp
codigo ends
end inicio
:hola:
-
Primero, pienso que hay que distinguir entre las interrupciones de D.O.S. y las de la B.I.O.S., pues si se busca informaciòn en un manual o en internet se puede llegar a una confusiòn.
Las interrupciones de DOS son màs sencillas de utilizar, funcionan con 21h y dependiendo de la funciòn, como ya se explicò, asì mismo serà la operatividad.
En el caso de interrupciones de la BIOS tambièn dependen de cuàl interrupciòn se utiliza (10h, 16h, 14h, 11h, etc) cada una se utiliza para una operaciòn distinta como leer del teclado, manejar video, puertos serial y paralelo, etc. Y cada una posee funciones tambièn distintas para especificar que se quiere hacer dependiendo de la interrupciòn para un dispositivo determinado. Por ejemplo la int10h utilizada para manejar video varia la funciòn para saber la posiciòn del cursor, del pixel, actualizar un caracter, cambiar color, etc.
Lo màs conveniente serìa comenzar a utilizar las de DOS y luego las de la BIOS.
Saludos, éxitos y Chao! :clown:
-
Gracias por las enteriores respuestas me han servido de mucho, resolvi uno de los pequeños problemas que tenia, realmente el programa en el que estoy trabajando trata de pedir 10 caracteres guardarlos en el stack y luego sacarlos para imprimirlos en pantalla.
Ya estuve trabajando sobre mi programa, y logro que haga lo que debe hacer, solo que al correrlo imprime otros caracteres que no deberia imprimir, espero y me puedan ayudar a resolverlo. Y ademas si pueden decirme como puedo ver el contenido del stack mientras estoy probando el programa en el TASM40 ya que solo puedo visualizar los valores de los registro, pero no supe como en el caso del stack o la pila.
Les dejo mi pequeño codigo como referencia si alguno quiere echarle un vistazo.
Gracias.