Pregunta de ensamblador

Resulta que ahora en clase me han pedido estos dos ejercicios pero sin habernos explicado para nada a usar el "tasm" ese. Alguien me puede echar un cable? los ejercicios son sencillos pero me salen errores por todos los lados

Ejercicio1: Un programa en ensamblador que pida el nombre ("dame tu nombre") y muestre ("hola" + nombre)

ejercicio 2: UN programa que pida un numero("introduce un numero") y muestre el factorial("el factorial de"x" es" xx);

A ver si me echais un cablecillo Gracias de antemano

Reply to
Netma
Loading thread data ...

"Netma" escribió en el mensaje news:c9frfj$399$ snipped-for-privacy@news.ya.com...

habernos explicado para nada a usar el "tasm" ese.

salen errores por todos los lados

("hola" + nombre)

factorial("el factorial de"x" es" xx);

formatting link
formatting link

Saludos Miguel Giménez

Reply to
Miguel Gimenez

Os paso el archivo que he hecho, tiene que haber unas burradas de campeonato. A ver si me sabeis decir porque yo no...

begin 666 nombre.asm M#0I4251,12!.;VUB

Reply to
Netma

campeonato. A ver si me sabeis decir porque yo no...

Los asteriscos son las modificaciones, los comentarios te los debo. Saludos. Eduardo.

TITLE Nombre

.Model Small

.Data peticion db "Dame tu nombre: $" saludo db "hola $" buffer_teclado LABEL ;****************** numMaximo db 50 leidos db 0 buffer db 50 dup(0) ; vector de 50 caracteres

.Code start: mov ax,@data ;****************** mov ds,ax ;******************

MOV AH,9 MOV DX,offset peticion INT 21h

MOV AH,10 MOV DX,offset buffer_teclado ;****************** INT 21h

mov ah,2 ;****************** mov dl,0Ah ;****************** int 21h ;******************

MOV AH,9 MOV DX,offset saludo int 21h ;******************

mov al,leidos ;****************** mov ah,0 ;****************** mov si,ax ;******************

MOV byte ptr buffer[SI],'$' MOV AH,9 MOV DX,offset buffer INT 21h .Exit

End start ;******************

Reply to
Eduardo

Gracias!!!!!!!!!!!!!!1 me pongo con ello ahora mismo, es que no tengo ni pu. Muchas gracias!!!

"Eduardo" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

Reply to
Netma

Por favor, donde has aprendido? es que yo kiero aprender, pero enseñan tan mal que nadie lo hemos pillado. Gracias otra vez.

"Eduardo" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

Reply to
Netma

mal que nadie lo hemos pillado.

Aprender a programar en assembler x86 con Tasm o Masm tuve que hacerlo solo, no arranque de cero, ya programaba para Z80 con el Zeus en la gloriosa Spectrum (cae una lagrima) y estaba enamorado del assembler, en esas epocas era muy ventajoso, hoy ya no, pero bueno... estan los gustos personales.

Para programar en entorno DOS busca: Norton Guide y agregale las bases Interrupts&ports(int.ng) iAPx86(x86.ng) TasmV4.0(tasm.ng) Programmers Reference(progref.ng) Peter Norton Programmers Guide(norton.ng) Bios Ref. (bios.ng) Tasm & Masm assembly language (tmasm.ng). La Interrupt List de Ralf Brown y la DosRef de Dave Williams. Si bien es informacion obsoleta (tan obsoleta como el DOS) encuentras perdidas joyitas que no ves en ningun otro lado, desde funciones no documentadas del DOS (InterruptList) al codigo fuente de un BIOS (DosRef).

Lejos mas interesante es programar para WIN32, todo lo que necesitas esta en la pagina de ICZELION , incluso hay versiones de sus tutoriales en español. Fundamental bajar el help con las API.

Volviendo a tu programa , ahora van los comentarios.

TITLE Nombre

.Model Small

.Data peticion db "Dame tu nombre: $" saludo db "hola $" buffer_teclado LABEL ;****************** Sin comentarios numMaximo db 50 leidos db 0 buffer db 50 dup(0) ; vector de 50 caracteres

.Code start: mov ax,@data ;****************** ;Cuando inicia un EXE el DS apunta al PSP no al segmento definido en .DATA mov ds,ax ;****************** DS no admite direccionamiento inmediato ->

mov ds,@data ERROR

MOV AH,9 MOV DX,offset peticion INT 21h

MOV AH,10 MOV DX,offset buffer_teclado ;****************** Sin comentarios INT 21h

mov ah,2 ;****************** INT21hFC10h "Print String" no maneja caracteres de control mov dl,0Ah ;****************** para bajar una linea hay que usar int 21h ;****************** INT21hFC02h "Print Character"

MOV AH,9 MOV DX,offset saludo int 21h ;****************** Olvidada

mov al,leidos ;****************** leidos es de 8bits, no lo puedes asignar mov ah,0 ;****************** directamente a un registro de

16bits. mov si,ax ;****************** Salvo que uses instrucciones del 386 -> movzx si,leidos

MOV byte ptr buffer[SI],'$' MOV AH,9 MOV DX,offset buffer INT 21h .Exit

End start ;****************** Falto declarar el punto de inicio.

Reply to
Eduardo

Y hacer este mismo programa pero que pida un numero y hacer el factorial.... me han dicho que es mu chungo. Nu se nuse, estoy hecho un lio de tres parece de coj.....

Gracias por tus respuestas Eduardo

"Eduardo" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

Reply to
Netma

han dicho que es mu chungo. Nu se nuse, estoy hecho

Desde luego si que estas en un lío, porque aún sabiendolo todo del ensamblador y teniendo el culo pelado de hacer programas, no hay un programa de asm que salga a la primera, necesitas luego hacerlo correr paso a paso porque seguro que hay algun error, es dificil que alguien te haga todo eso y te lo deje listo para presentarlo ;-)

El factorial no es dificil, más dificil es pasar un numero que te viene como una linea de texto a numero en binario, a poco que quieras dar flexibilidad al usario para que ponga espacios, o quieras controlar que no te meta letras, etc...

Reply to
Nolo Pongo

Las interfaces de usuario en ensamblador son... fascinantes. Doy fe :/

Saludos

Cristobal

Reply to
Cris

factorial.... me han dicho que es mu chungo. Nu se nuse, estoy hecho

Definitivamente, una parte ya te la dijo NoloPongo, necesitas rutinas de conversion de ascii a entero de xBits y viceversa, salvo que sea licito usar alguna libreria hecha por otro. El calculo propiamente dicho del factorial tiene como unico inconveniente que crecen demasiado rapido, si se especifica N

Reply to
Eduardo

Hola:

Netma escribió:

que nadie lo hemos pillado.

Échale un vistazo al "Universo Digital del IBM PC, AT y PS/2" de Ciriaco García de Celis:

formatting link

Reply to
Javier

Perdonad que no haya respondio na, esque me operaron hace dos dias de la rodilla y acabo de llegar a casa. Os paso lo que tengo hecho de factorial por modulos a ver que opinais (aunke no se porque no funciona)

DATOS SEGMENT

dato db 3 ;Numero del que calcularemos su factorial

DATOS ENDS

PILA SEGMENT STACK "STACK" db 40h dup(0) PILA ENDS

EXTRA SEGMENT result dw 0,0 ;2 palabras (4 bytes) EXTRA ENDS

CODE SEGMENT assume CS:code,DS:datos,ES:extra,SS:pila

factorial db 0 ;Variable para guardar el factorial

START PROC

call inicializar ;Inicializa los registros de segmento mov sp,64 ;Carga el puntero de pila con el valor mas alto

mov cl,dato call calcula_factorial ;Calcula el faltorial de dato mov factorial,al ;Almacenar el resultado en factorial call muestra_factorial ;Muestra el valor del factorial

mov ax,4C00h ; int 21h ;Terminar el programa

START ENDP

inicializar proc near

mov ax,datos mov ds,ax mov ax,pila mov ss,ax mov ax,extra mov es,ax

ret

inicializar endp

Reply to
Netma

rodilla y acabo de llegar a casa.

(aunke no se porque no funciona)

; EL VALOR POR DEFECTO ES 1K.

PARA QUE EN EL SEGMENTO DE CODIGO? , ADEMAS, CUAL ES EL MAXIMO FACTORIAL QUE TIENES QUE CALCULAR?

alto NONES, VER MAS ADELANTE

INICIALIZADOS. SOLAMENTE HAY QUE CARGAR DS Y ES , PORQUE ARRANCAN APUNTANDO AL PSP

POR OTRO LADO, CUANDO SE CAMBIA EL VALOR DEL SS LA INSTRUCCION SIGUIENTE DEBE SER MOV SP,XX , Y SI NO SE PUEDE POR LO QUE SEA, INHIBIR LAS INTERRUPCIONES, SI JUSTO ENTRARA UNA TENDRIAS EL STACK EN CUALQUIER PARTE.

MOV SS,REG/MEM INHIBE LAS INTERRUPCIONES POR 'UNA' INSTRUCCION.

CODE ENDS ; FALTABA END START ; IDEM

Que debugger estas usando?

Saludos. Eduardo.

Reply to
Eduardo

Entonces como kedaria? Debugger? uso el tasm a palo seco, ningun debugger.

Eduardo" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

Reply to
Netma

Ya que usas Tasm, busca el Turbo Debugger , si no vas a parir buscando errores. Compilas Tasm /zi Programa Linkeas Tlink /v Programa

Eduardo.

DATOS SEGMENT

dato db 3 ;Numero del que calcularemos su factorial

DATOS ENDS

PILA SEGMENT STACK "STACK" ; saco db 40h dup(0) ; default = 400h PILA ENDS

EXTRA SEGMENT result dw 0,0 ;2 palabras (4 bytes) EXTRA ENDS

CODE SEGMENT assume CS:code,DS:datos,ES:extra,SS:pila

factorial db 0 ;Variable para guardar el factorial

START PROC

call inicializar ;Inicializa los registros de segmento ; saco mov sp,64

mov cl,dato call calcula_factorial ;Calcula el faltorial de dato mov factorial,al ;Almacenar el resultado en factorial call muestra_factorial ;Muestra el valor del factorial

mov ax,4C00h ; int 21h ;Terminar el programa

START ENDP

inicializar proc near

mov ax,datos mov ds,ax ; saco mov ax,pila ; saco mov ss,ax mov ax,extra mov es,ax

ret

inicializar endp

CODE ENDS

END START

Reply to
Eduardo

Ya me lo he bajado, El de borland., pero a ver como se utiliza eso porque tengo las practica que entregarlas mañana viernes. Buufff estoy..... Aun asi gracias

"Eduardo" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

Reply to
Netma

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.