Programación General > ASM (Ensamblador)
Exec
(1/1)
Bicholey:
:o
Bueno he estado trabajando con las funciones para cargar ejecutables de la siguiente forma:
nombre DB "C:\command.com",0
LEA DX,nombre
MOV AX,4B00h
INT 21h
lo compilo con el MASM , no hay error lo ligo con Link y no hay error pero lo ejecuto y me dice que ha hecho una operacion no permitida ¿ A que creen que se deba ?
Por su atencion gracias
Eternal Idol:
Nunca lo hice pero por lo que lei en el libro de assembly que tengo hay que haces bastantes mas cosas. No suelo meter codigo pero supongo que no importara tanto:
--- Código: Text --- ; Segmento de pila segment Pila stack resw 512FinPila: ; Segmento de datos segment Datos ; Este campo indicará el número; de programas a ejecutar NumProgramas dw 3 ; Descripciones y nombres de los programas Desc1 db 'Demostraci¢n de color en CGA$'Prog1 db '.\puntocga.exe', 0Desc2 db 'Demostraci¢n de color en EGA$'Prog2 db '.\colorega.exe', 0Desc3 db 'Efectos de color en VGA$'Prog3 db '.\colorvga.exe', 0 ; Tabla de punteros a las; cadenas con anterioresTblPunteros dw Desc1, Prog1 dw Desc2, Prog2 dw Desc3, Prog3 ; Bloque de parámetros para; el servicio 4Bh de la int 21hBloqueParametros dw 0; usar entorno del DOS dd LineaComandos; cadena de parámetros dd FCB1, FCB2; FCBs ; La cadena de parámetros está vacíaLineaComandos db 0,13 ; como los FCBFCB1 resb 20FCB2 resb 20 ; Esta etiqueta marca el; fin del segmento de datos FinDatos ; Segmento de código segment Codigo..start: ; Configuramos los ; registros de pila mov ax, Pila mov ss, ax mov sp, FinPila ; y los registros de ; segmento de datos mov ax, Datos mov ds, ax ; Ajustamos la memoria ; asignada a justo la ; que necesitamos call AjustaMemoria ; Hacer que ES también ; apunte a los datos push ds pop es ; obtenemos el contador ; de programas a ejecutar mov cx, [NumProgramas] ; BX apunta a la tabla ; de punteros a cadenas mov bx, TblPunteros Bucle: ; obtenemos en DX la ; dirección de una cadena ; con la descripción del ; programa a ejecutar mov dx, [bx] ; la mostramos mov ah, 9 int 21h ; y esperamos una tecla mov ah, 0Ch mov al, 7 int 21h ; nos desplazamos al ; siguiente puntero add bx, 2 ; recuperamos la dirección ; del nombre del programa mov dx, [bx] ; lo ejecutamos call Ejecuta ; pasamos al siguiente puntero add bx, 2 ; y repetimos el proceso loop Bucle ; Devolvemos el control ; al sistema mov ah, 4ch int 21h ;-------------------------------; Esta rutina calcula la memoria; que necesita el programa y ; reajusta el bloque asignado; por el sistema.; Es importante no haber modificado; el contenido del registro ES; antes de llamar a esta rutina;-------------------------------AjustaMemoria: ; Tomamos en BX la dirección ; del final del código más ; 256 bytes del PSP mov bx,FinCodigo+256 ; le añadimos lo que ocupa ; el segmento de pila add bx, FinPila ; y también lo que ocupa ; el segmento de datos add bx, FinDatos ; dividimos entre 16 para ; convertir a párrafos shr bx,4 ; sumamos un párrafo por ; cada segmento que tenemos: ; pila, datos y código, para ; compensar los ajutes add bx, 3 ; redimensionamos el bloque ; de memoria asignado mov ah,4ah int 21h ; y volvemos ret ;----------------------------------; Esta rutina recibe en DX la; dirección de una cadena con el ; nombre del programa a ejecutar ;---------------------------------- Ejecuta: ; guardamos registros push ds push es pusha ; ponemos AL a 0 para indicar ; que deseamos ejecutar xor al, al ; número del servicio mov ah, 4Bh ; DS:DX ya tiene la dirección ; del nombre del programa ; ES:BX debe apuntar al ; bloque de parámetros ; dirección del bloque mov bx, BloqueParametros ; ejecutamos int 21h ; recuperamos los registros popa pop es pop ds ret; y volvemos ; Esta etiqueta marca el final; del segmento de código FinCodigo:
Bicholey:
;)
Wow pues lo voy a checar
Navegación
Ir a la versión completa