Ensamblador - CON QUE INSTRUCCION DEVUELVO UN VALOR A MEMORIA

 
Vista:

CON QUE INSTRUCCION DEVUELVO UN VALOR A MEMORIA

Publicado por KUKULUA (1 intervención) el 26/09/2002 18:39:49
COMO DEVUELVO UN VALOR A MEMORIA USANDO PASCAL, DE MODO QUE UN PROGRAMA EN MSDOS RECIBA ESTE VALOR COMO SI EL PROGRAMA FUERA UNA FUNCION SOLO NECESITO ENVIAR UN 1 O UN CERO
GRACIAS
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:CON QUE INSTRUCCION DEVUELVO UN VALOR A MEMORIA

Publicado por Googol (61 intervenciones) el 28/09/2002 12:51:16
No se entiende muy bien el problema... Si lo que quieres es que el programa completo tenga un valor resultado, para utilizarlo, por ejemplo, en los ficheros .bat, tienes ue utilizar la función 4Ch de salida, y poner en el registro AL el valor a devolver.

MOV AX, 4C00h ; Devolvemos un 0
INT 21h

MOV AX, 4C01h ; Devolvemos un 1
INT 21h

Suerte!

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Primero en Pascal...

Publicado por Jorge (126 intervenciones) el 08/10/2002 05:15:55
Me parece que lo que querés hacer es pasarle un parámetro a un programa MSDOS. Pero bueno, te explico cómo mandar un parámetro a un programa y cómo recibir el parámetro de vuelta en Pascal y cómo invocar un programa en ASM (porque el retorno es lo que explicó Googol).
Para mandar un valor a un programa, te conviene hacerlo como parámetro, al estilo de cuando hacés un "dir /p". En Pascal, las instrucciones para ejecutar un programa externo típicamente son:

PROGRAM xxx
USES DOS;

BEGIN
...
SwapVectors;
Exec(pathYnombreDelArchivoEjecutable, parámetros);

{En la línea anterior, llamás al programa externo anteponiendo la información del path si es necesario. En el ejemplo del dir, el primer parámetro sería "dir.exe" y en el segundo le pondés mandar información al programa, por ejemplo "/p" haría que el programa "dir" se ejecute por página).

{Ahora, si lo que querés es que el programa te retorne información, lo más fácil es hacer que retorne un número (que es justo lo que vos querés, ¿no?).
El número que retorna el programa que llamaste, una vez finalizado, queda en una variable global llamada "DosError". De forma que para consultarlo podés hacer una cosa así:}

IF DosError = 0 THEN ...
...

SwapVectors;
...
END;

(sigue...)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

...y ahora en ASM

Publicado por Jorge (126 intervenciones) el 08/10/2002 05:23:38
Lo anterior fue la parte Pascal. Lo mismo tiene un equivalente en ASM, que en parte es lo que explicó Googol (el retorno) y queda la invocación de un programa externo desde el tuyo, que se hace así:

*** ATENCION: Se supone que el programa es un .COM ***

PathYfile DB "c:\dir.exe",0
Parameter DB "/p",0
ParameterBlock DB 14 DUP(0)
oldSS DW 0
oldSP DW 0

...
mov AX, SS
mov oldSS, AX
mov AX, SP
mov oldSP, AX ; Ya sé que en un .COM se trabaja con un único segmento, pero si
; lo quieren hace en un .EXE es mejor que recuerden hacer esto!!!

mov WORD PTR [parameterBlock], 0 ; Segmento de los Strings del entorno
mov DX, OFFSET PathYfile ; DS:DX apuntan al nombre y path del programa
mov BX, OFFSET ParameterBlock ; ES:BX apuntan al bloque de parámetros

mov AX, CS
mov WORD PTR [ParameterBlock + 2], AX ; Segmento del command line
mov WORD PTR [ParameterBlock + 4], OFFSET Parameter ; Offset del command line
mov [ParameterBlock + 6], AX ; Segmento del FCB primario
mov WORD PTR [ParameterBlock + 8], 5Ch ; Offset del FCB primario
mov [ParameterBlock + Ah], AX ; Segmento del FCB secundario
mov WORD PTR [ParameterBlock + Ch], 6Ch ; Offset del FCB secundario
mov AX, 4B00h
Int 21h
(sigue...)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

...y ahora en ASM (2)

Publicado por Jorge (126 intervenciones) el 08/10/2002 05:36:15
(viene del anterior...)
...
mov AX, oldSS
mov SS, AX
mov AX, oldSP
mov SP, AX

Y por fin terminamos la invocación!!!, bueno, atención que toda la información de los registros es destruida, incluyendo los de la pila, por eso guardé SS y SP en variables, hacé lo mismo con los registros que quieras preservar.
Fijate que la invocación a la Int 21h tira error si el CF está puesto y te deja un código de error en AX.

Bueno, la verdad, ¡¡¡estoy re podrido de escribir!!! jajaja, espero te sirva de algo y acordate que las dudas sobre Pascal se preguntan en ese foro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar