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 ---        &#59; Segmento de pila        segment Pila stack          resw 512FinPila:        &#59; 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&#59; usar entorno del DOS   dd LineaComandos&#59; cadena de parámetros   dd FCB1, FCB2&#59; 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                &#59; Segmento de código        segment Codigo..start:        &#59; Configuramos los       &#59; registros de pila        mov ax, Pila        mov ss, ax        mov sp, FinPila               &#59; y los registros de       &#59; segmento de datos        mov ax, Datos        mov ds, ax            &#59; Ajustamos la memoria       &#59; asignada a justo la       &#59; que necesitamos        call AjustaMemoria        &#59; Hacer que ES también       &#59; apunte a los datos        push ds        pop es                           &#59; obtenemos el contador       &#59; de programas a ejecutar        mov cx, [NumProgramas]               &#59; BX apunta a la tabla       &#59; de punteros a cadenas        mov bx, TblPunteros        Bucle:        &#59; obtenemos en DX la       &#59; dirección de una cadena       &#59; con la descripción del       &#59; programa a ejecutar        mov dx, [bx]                       &#59; la mostramos        mov ah, 9        int 21h               &#59; y esperamos una tecla        mov ah, 0Ch        mov al, 7        int 21h               &#59; nos desplazamos al        &#59; siguiente puntero        add bx, 2               &#59; recuperamos la dirección       &#59; del nombre del programa        mov dx, [bx]               &#59; lo ejecutamos        call Ejecuta               &#59; pasamos al siguiente puntero        add bx, 2               &#59; y repetimos el proceso        loop Bucle               &#59; Devolvemos el control       &#59; 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:        &#59; Tomamos en BX la dirección        &#59; del final del código más        &#59; 256 bytes del PSP         mov bx,FinCodigo+256        &#59; le añadimos lo que ocupa        &#59; el segmento de pila         add bx, FinPila        &#59; y también lo que ocupa        &#59; el segmento de datos         add bx, FinDatos                 &#59; dividimos entre 16 para        &#59; convertir a párrafos         shr bx,4                 &#59; sumamos un párrafo por        &#59; cada segmento que tenemos:        &#59; pila, datos y código, para        &#59; compensar los ajutes         add bx, 3                 &#59; redimensionamos el bloque        &#59; de memoria asignado          mov ah,4ah           int 21h                     &#59; y volvemos         ret        ;----------------------------------; Esta rutina recibe en DX la; dirección de una cadena con el ; nombre del programa a ejecutar ;----------------------------------        Ejecuta:       &#59; guardamos registros        push ds        push es        pusha        &#59; ponemos AL a 0 para indicar       &#59; que deseamos ejecutar        xor al, al               &#59; número del servicio        mov ah, 4Bh               &#59; DS:DX ya tiene la dirección       &#59; del nombre del programa       &#59; ES:BX debe apuntar al        &#59; bloque de parámetros               &#59; dirección del bloque        mov bx, BloqueParametros       &#59; ejecutamos        int 21h               &#59; recuperamos los registros        popa        pop es         pop ds               ret&#59; y volvemos        ; Esta etiqueta marca el final; del segmento de código        FinCodigo:                  

Bicholey:
;)
Wow pues lo voy a checar

Navegación

[0] Índice de Mensajes

Ir a la versión completa