PREGUNTAS CONTESTADAS - Ensamblador

 Hay un total de 123 Preguntas.<<  >> 

    Pregunta:  45097 - PROGRAMA EN ENSAMBLADOR QUE SE CARGE AL INICIAR LA MAQUINA
Autor:  Rodrigo Morales Alvarado
Hola, quisiera saber si alguien me pude explicar como podemos guardar una rutina en el sector 0 pista 0 de un floppy para desplegar un mensaje haciendo uso de la interrupción 10.

Me han dicho que no es posible hacerla con el tasm, y que es recomendable hacerlo con el debug de ms-dos pero la verdad no tengo idea.

Si me pueden proporcionar el codigo, por lo menos para cargar la rutina, se los agradeceria mucho

Salu2
  Respuesta:  Gabriel Amezquita
primero entramos a DEBUG

c:>debug

ensmablamos a memoria

-a

la maquina despliega
00c3:0100

escribir DW "mensaje que quieres guardar" y presionas 2 veces enter

ahora para escribir el mensaje a disco:

-w 100 0 0 1

donde w es escribir
100 lugar de la memoria donde esta el mensaje
0 unidad de disquette
el primer 0 sector inicial
el segundo 1 numero de sectores a guardar

para leer el mesaje escrito cargarlo a memoria
L 100 0 0 1

hay que asegurarse que exista disco y que tenga formato
porque la funcion W y L solo funcionan en discos formateados con fat

para escritura/lectura absoluta ( en cualquier formato de disco )
hay que hacer un programa utilizando la funcion 13 del BIOS

    Pregunta:  45460 - COMO CARGAR UN PARAMETRO DESDE LINEA DE COMANDOS
Autor:  Jose Murillo
hola, quisiera saber como se carga un archivo como parametro desede la linea de comandos, gracias
  Respuesta:  Rafael Rodriguez
En es:[80h] puedes encontrar en número de caracteres que se han pasado como parámetros. En 81h hay un espacio en blanco y a partir de 82h están los parámetros.

Aquí pongo código fuente:
MOV DX,0
mov dL,es:[80h] ;AQUI ESTA EL NUMERO DE CARACTERES DE LOS PARAMETROS
cmp dl,0
jne segU
call borra
escribe noparam,4,1
escribe asionada,5,1
mov ah,4ch
int 21h
segU:
MOV CX,DX
MOV SI,82H ;EN 81H HAY UN ESPACIO ENTRE EL NOMBRE DEL ARCHIVO.
MOV DI,0 ;Y LOS PARAMETROS.
PARAM:
MOV AL,ES:[SI]
MOV NOMPCX[DI],AL
INC DI
INC SI
LOOP PARAM
DEC DI
MOV NOMPCX[DI],0 ;con esto acepto los parámetros que se hayan
;introducido al ejecutar el programa.

    Pregunta:  47195 - INT1A, MEDIR TIEMPO DE EJECUCION DE UN TROZO DE PROGRAMA
Autor:  MIGUEL BARVO
Me gustaria saber como realizar una función que mida el tiempo de ejecucion de un programa, por ejemplo q salga una letra en pantalla y mida el tiempo que salio y el tiempo en q el usuario la apreto!... gracias por sus futuras respuestas....
  Respuesta:  Ruben Toca Lucio
Te envio codigo en ensamblador para conocer los tics usados por tu codigo:
db 0fh,31h;mov [dword tics],eax;cld;nop;nop;nop;nop;nop;nop;nop;nop;pon tu codigo
aqui;clc;db 0fh,31h;sub eax,[dword tics];sub eax,15;
y ya tienes en eax los tics que usa tu codigo.
Espero que te sirva.
Un saludo.

    Pregunta:  48574 - ESTADISTICAS DE DISKETE
Autor:  Javier Alejandro Yàñez Portero
Saludos:
quisiera preguntar como en lenguaje ensamblador puedo obtener los datos de un diskete como los que arroja el scandisk de windows;
clusteres sin llenar totalmente y ademas la cantidad de los que estan llenos, cuantos estan en mal estado, espacio total, utilizado en subdirectorios y directorios, directorio raiz.

gracias
  Respuesta:  marianne Licea Fonseca
para lo que quieres se utiliza el servicio 36h de la int 21h, el cual presenta los siguientes parámetros de Entrada y de salida:
Entrada ------- AH: 36h
DL: Codigo de Unidad --> 0 – Unidad Actual,
1 – Unidad A (Disco 3½),
2 – Unidad B,
3 – Unidad C, Etc.
Salida -------- AX: 65535: si el dispositivo no existe,
sino (dispositivo existe),
-------- AX: cantidad de sectores por clúster.
BX: Clústers disponibles.
CX: Bytes por sector.
DX: Total de clústers en el disco

Ejemplo de código (calcular el espacio libre del floppy en KB):

MOV AH,36h
MOV DL,1 ; Código de dispositivo o unidad en este caso A:
INT 21H
JC error ; preguntar si hubo error, de lo contrario
MUL CX ; Se calcula espacio libre en KB por variante(ax*bx*cx)/1024
MUL BX
MOV CX,1024
DIV CX ;En AX se obtiene el espacio libre en KB
  Respuesta:  marianne Licea Fonseca
Disculpa, no leí tu pregunta hasta el final. Creo que debes primeramente conocer la estructura lógica del diskete, yo te puedo enviar esa información pero no creo que pueda ser por esta vía, si quieres me mandas tu dirección de correo y te lo envío después. Puede ser que me demore un poquito pero será..
Saludos

    Pregunta:  48816 - PROGRAMACION HIBRIDA ENTRE C Y LENGUAJE ENSAMBLADOR
Autor:  Mayra Glez. G.
Hola!!... bueno pues no soy muy buena en esto.. y quisiera saber como ejecutar un programa en lenguaje ensamblador desde C.... si.. podrian decirme como.. gracias... hasta pronto!...
  Respuesta:  Nombre Apellidos
La verdad es que ahora noencuentro la informacin exacta, pero creo recordar qu para la ejecucion de un programa, (en cualquier lenguaje , C, ensamblador,... ), compilado, habia que emplear la funcion :
exec("programita.exe");
Si lo qeu quieres es ejecutar un trozo de programa que has programado en ensamblador, habia que ponerlo entre llaves, con la etiquta asm al comenzar:
asm{
instrucciones de ensamblador
}

    Pregunta:  50023 - CANTIDAD DE VOCALES EN UNA CADENA
Autor:  david alujes
necesito saber como contar la cantidad de vocales que tiene una cadena,y la cantidad de cada vocal
  Respuesta:  Chaco Chaquito
Aqui esta, sufri mucho por esto...XD
.model small
.stack
.data
pide db 'Teclea una palabra',10,13,'$'
cad db 80 dup(' '),'$'

msg1 db 10,13,'a: $'
msg2 db 10,13,'e: $'
msg3 db 10,13,'i: $'
msg4 db 10,13,'o: $'
msg5 db 10,13,'u: $'

Aa db 0
Ee db 0
Ii db 0
Oo db 0
Uu db 0
.code
mov ax,@data
mov ds,ax

mov ah,00h
mov al,03h
int 10h

lea dx,pide
mov ah,09h
int 21h

lea si,cad
mov cx,0
lee:
mov ah,01h
int 21h
cmp al,'$'
je termina
mov [si],al
inc si
inc cx
jmp lee
termina:
lea si,cad
mov bl,0
ciclo:
mov al,[si]
mov dl,al

cmp dl,'a'
je sumaAs
cmp dl,'A'
je SumaAs

cmp dl,'e'
je SumaEs
cmp dl,'E'
je SumaEs

cmp dl,'i'
je SumaIs
cmp dl,'I'
je SumaIs

cmp dl,'o'
je SumaOs
cmp dl,'O'
je SumaOs

cmp dl,'u'
je SumaUs
cmp dl,'U'
je SumaUs

cmp dl,'$'
je FinCiclo
Sigue:
inc si
jmp ciclo
SumaAs:
inc Aa
jmp Sigue
SumaEs:
inc Ee
jmp Sigue
SumaIs:
inc Ii
jmp Sigue
SumaOs:
inc Oo
jmp Sigue
SumaUs:
inc Uu
jmp Sigue
FinCiclo:
lea dx,msg1
mov ah,09h
int 21h

mov dl,Aa
add dl,30h
mov ah,02h
int 21h

lea dx,msg2
mov ah,09h
int 21h

mov dl,Ee
add dl,30h
mov ah,02h
int 21h

lea dx,msg3
mov ah,09h
int 21h

mov dl,Ii
add dl,30h
mov ah,02h
int 21h

lea dx,msg4
mov ah,09h
int 21h

mov dl,Oo
add dl,30h
mov ah,02h
int 21h

lea dx,msg5
mov ah,09h
int 21h

mov dl,Uu
add dl,30h
mov ah,02h
int 21h

mov ah,4ch
int 21h
end
  Respuesta:  Francisco Carrillo
Bueno, pues lo primero que tienes que hacer es contar con cinco variables declaradas, cada una funcionará como acumulador de cada letra. Luego incializa dichas variables a 0 e inicias un ciclo donde vayas leyendo caracter por caracter la cadena mediante el uso del registro di o si(por ejemplo mov al, cadena[si]), previamente incializado en cero y compares si cadena[si] es igual a 'a' o a 'A'(
ciclo_cuenta_vocales:
...
...
...
cmp al, 'a'
je sumaAs
cmp al, 'A'
je sumaAs
cmp al, 'e'
je sumaEs
. ..
..
..
cmp al, '$'
je salir
sumaAS:
inc cuentaAs
....
....
inc di
jmp ciclo_cuenta_vocales
salir:
), luego si es cierto das un salto hacia una etiqueta que sea para incrementar el contador de a's(ver el ejemplo anterior), luego despues de de las comparaciones de las a`s pones la comparaciones y los saltos correspondientes a la 'e' o 'E' y haces lo mismo con todas las demás vocales , y al final pones un salto hacia el inicio del ciclo.El ciclo terminará cuando el caracter sea el que predefinas(en el ejemplo es el '$') el cual lo tendrás que insertar en la cadena al final ya sea al declararla o antes de inciar el ciclo.
Espero y la informacion te haya servido de algo

    Pregunta:  51165 - TECLADO CON SONIDO
Autor:  Nely PC
Alguien m puede ayudar para la solución de un programa en ensamblador que consiste en que en el momento de pulsar un tecla emita un sonido segun la letra seleccionada.

El sonido tiene que ser distinto para varias letras. Procurando que el sonido sea emitido por medio de bocinas externas y no las que tiene la maquina. Pero el ultimo punto puede ser omitido.
  Respuesta:  Anny Campos Cosme
Mira, yo no soy una experta en el tema y la verdad es que estoy aprendiendo porque soy estudiante de segundo año de informática pero con distintos valores de frecuencia puedes lograr distintos sonidos para las teclas. Solo tienes que detectar que tecla es la que está pulsada y según la tecla mandar a ejecutar el segmento de codigo que hace sonar la bocina con una frecuencia determinada por ti.
Aquí te pongo un ejercicio con su solución que te puede servir de guía y si lo modificas puedes lograr lo que quieres. De todos modos creo que tengo la solución para lo que quieres solo que no la encuentro. Escríbeme luego a ver si te la puedo dar.

salu2 yo

Realice un programa en ensamblador que al apretar cualquiera de las teclas del 1 al 5 la bocina suene un número de veces igual al digito que se apretó. Ej: Si se oprime el 3 que la bocina suene 3 veces (Primero durante tres segundos, después durante dos segundos, y finalmente durante un segundo) y a una frecuencia de 2000 Hz. Si aprieta una tecla que no está entre el 1 y el 5 debe mostrar un cartel indicándole al usuario que se equivocó y para salir apretar la n.

DOSSEG
.MODEL SMALL
.DATA
CARTEL DB 13,10,'Oprima una tecla del 1 al 5 para sonar la bocina, n para salir.',13,10,'$'
CARTEL1 DB 13,10,'No oprimi',162,' el d',161,'gito correcto.',13,10,'$'
NVECES DB 0
CONTEO DB 0
VIEJOIP1CH DW ?
VIEJOCS1CH DW ?
ENTRAR MACRO
MOV AH,1
INT 21H
ENDM
MOSTRAR MACRO VAR
PUSH AX
PUSH DX
MOV AH,9
LEA DX,VAR
INT 21H
POP DX
POP AX
ENDM
LEER MACRO VECTOR,VAR,VAR1
MOV AL,VECTOR
MOV AH,35H
INT 21H
MOV VAR,BX
MOV VAR1,ES
ENDM
ESCRIBIR MACRO VECTOR,SUB
MOV AL,VECTOR
MOV AH,25H
PUSH DS
MOV DX,OFFSET SUB
PUSH CS
POP DS;DS=CS
INT 21H
POP DS
ENDM
.CODE
SONAR PROC NEAR
MOV AX,@DATA
MOV DS,AX
LEER 1CH,VIEJOIP1CH,VIEJOCS1CH
ESCRIBIR 1CH,NUEVA1CH
VOLVER: MOSTRAR CARTEL
ENTRAR
CMP AL,'n'
JE SALIR
CMP AL,'N'
JE SALIR
SUB AL,30H
; A partir de aquí se comprueba que dígito se apretó, el registro BL comienza con valor 5
; y se ira comparando con AL y decrementando hasta llegar al valor 1.
CMP AL,1
JB ERROR
CMP AL,5
JBE SEGUIR
ERROR: MOSTRAR CARTEL1 ;Muestro este cartel si equivoca el dígito.
JMP VOLVER
;Sonar bocina y cargo la base de conteo correspondiente a la frecuencia 2000 Hz.
SEGUIR: MOV NVECES,AL ;Porque se usa AL posteriormente.
MOV AX,596
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
REPETIR: IN AL,61H ;Encender Bocina.
OR AL,00000011B
OUT 61H,AL
MOV AL,18 ;Multiplicando NVECES*18 obtengo los segundos que debo esperar.
MOV BL,NVECES
MUL BL
MOV CONTEO,AL
LAZO: CMP CONTEO,0 ;Lazo de espera por las conteo igual a NVECES*18 ITs,
JNE LAZO ;se decrementa CONTEO en la subrutina de IT.
IN AL,61H ;Apagar Bocina.
AND AL,11111100B
OUT 61H,AL
MOV CONTEO,18
LAZO1: CMP CONTEO,0 ;Lazo de espera para 1 segundo entre intervalos de sonido.
JNE LAZO1
DEC NVECES
JNZ REPETIR
JMP VOLVER
;Restaurar el vector viejo de la INT 1Ch.
SALIR: MOV DX,VIEJOIP1CH
MOV AX,VIEJOCS1CH
MOV DS,AX
MOV AH,25H
MOV AL,1CH
INT 21H
MOV AX,4C00H
INT 21H
SONAR ENDP
NUEVA1CH PROC FAR
MOV AX,@DATA ;Esta rutina la llama la IT 8 mediante INT 1Ch.
MOV DS,AX
DEC CONTEO
IRET
NUEVA1CH
ENDP
END

    Pregunta:  51368 - COMO INVOCAR EL CLICK DERECHO EN ENSAMBLADOR
Autor:  monse gonzalez
mov ax,011b ; determina que el click es izq
int 33h
and bx,1 ;si fue presionado el derecho, se regresa a inicia hasta que se presione el iquierdo
cmp bx,01
jne inicia

si para el click izquierdo es asi, tons para el derecho??
  Respuesta:  Rogelio L
La int 33h con el servicio 3 (011b) retorna lo siguiente:
CX: Pocision horizontal (0-639)
DX:Pocision vertical (0-199)
BX: 01b si el boton presionado fue el izquierdo y
010b si fue el derecho

por lo tanto:
and bx, 01b ;da 1 si el presionado fuen el izquierdo y
and bx, 010b ; da 1 si fue presionado el derecho

el programa quedaria asi:

mov ax,011b ; llama al servicio 3 de la interrupcion 33h
int 33h
and bx,2 ;si fue presionado el izquierdo, se regresa a inicia hasta que se presione el derecho
cmp bx,02
jne inicia

    Pregunta:  51501 - PASAR NUMERO 32 BITS EN 2 REGISTROS DE 16 A VARIABLE DE 32
Autor:  jesus garcia martin
Hola buenas, aki estoy dando mis primeros pinitos en ensamblador y tengo un ejercicio casi terminado pero no me sale lo mas sencillo. Ojala me puedan ayudar porque no le veo la manera y he intentado varias cosas ya. Para empezar estamos en Turbo ensamblador de borland sin usar registros ni directivas de 32 bits, es decir ensamblador de MSDOS practicamente, asi k nada de usar registros extendidos ni instrucciones complejas de 32 bits.

Bueno la cuestion es k al final tengo un numero de 32 bits en dos registros de 16:

- los 16 bits mas altos en DX
- los 16 bits mas bajos en AX

Quiero pasar ese numero de 32 bits a una variable llamada:

- resultado DD 0 ; (Esto es la definicion doble-palabra)

Y he probado con diferentes opciones de mov y movzw o algo asi pero nada, seguramente que en la sintaxis o en los typecast o algo me equivoque. Espero k alguien me de una solucion, ya mas bien por saber como es. Muchas gracias.
  Respuesta:  Marianne Licea
;Esta es una manera de hacerlo. De aquí sacas lo que te hace falta

Dosseg
.model small
.data
var dd ?

.code
main proc near
mov ax,@data
mov ds,ax
mov di, offset var
mov [di],ax ;El valor de AX se guarda en la parte baja de la variable
add di,2
mov [di],dx ;DX en la parte alta
mov ax,4c00h
int 21h
end

    Pregunta:  53541 - INTERRUPCIONES CON 16F84
Autor:  Rubén MiereS
Saludos, estoy aprendiendo a usar el microcontrolador 16f84, y estoy aciendo un programita pero el caso es q no m detecta las interrupciones externas, tengo conectado un pulsador a la patilla6 (RBO/INT), os pego aki la función principal a ver del programa q es donde tenia que detectarme esta interrupción para saltar a una subrutina, si se os ocurre algo comentarmelo por favor,

Gracias

LIST p=16f84
RADIX HEX
PUL EQU 0C

#include\"p16f84a.inc\"

ORG 0
goto inicio

ORG 6
inicio bsf INTCON,GIE ;Permite interrupciones,GIE=1.
bsf INTCON,RBIE ;Permite interrupciones de PORTB, RBIE=1.
bsf INTCON,INTE ;Permite interrupciones externas, INTE=1.
bcf STATUS,RP0 ;Cambio a banco 0, pone RP0 a 0
movlw b\'00000000\'
movwf PORTA
bsf STATUS,RP0 ;Cambio a banco 1, pone RP0 a 1
movlw b\'11110001\' ;Pone las 4 líneas de mayor peso y la de menor peso de PORTB como entrada.
movwf TRISB ;Mueve el contenido de W al TRISB.
movlw b\'00000000\' ;Pone las 4 líneas de menor peso de PORTA como salida.
movwf TRISA ;Mueve el contenido de W al TRISA.
bcf STATUS,RP0 ;Cambio a banco 0, pone RP0 a 0
bcf INTCON,INTF ;Borra el flag de interrupción externa.
s1 btfss INTCON,INTF ;Se salta la siguiente instrucción si INTF=1.
goto s1
nop
bcf INTCON,INTF ;Borra el flag de interrupción externa.
s2 btfss INTCON,RBIE ;Se salta la siguiente instrucción si RBIE=1.
goto s2
call pulsadores
goto s1
  Respuesta:  nadie nadie
Suponiendo que esten bien habilitadas todas las opciones para que funcione la interrupcion, al producirse esta, el programa salta a l vector de interrupcion, en la direccion 4, que no se ve este en el programa...
Has de introducir las lineas:

ORG 4
goto mi_interrrupcion

Y desarrollar lo que hace tu interrupcion, como haces con inicio

|<  <<  3 4 5 6 7 8 9 10 11 12 13  >>  >|