• Viernes 29 de Marzo de 2024, 12:48

Autor Tema:  Exec  (Leído 1399 veces)

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Exec
« en: Martes 30 de Mayo de 2006, 09:00 »
0
: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
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Exec
« Respuesta #1 en: Martes 30 de Mayo de 2006, 22:01 »
0
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
  1.  
  2.        &#59; Segmento de pila
  3.         segment Pila stack
  4.           resw 512
  5. FinPila:
  6.  
  7.        &#59; Segmento de datos
  8.         segment Datos
  9.  
  10. ; Este campo indicará el número
  11. ; de programas a ejecutar        
  12. NumProgramas dw 3    
  13.        
  14. ; Descripciones y nombres de los programas      
  15. Desc1 db 'Demostraci¢n de color en CGA$'
  16. Prog1 db '.\puntocga.exe', 0
  17. Desc2 db 'Demostraci¢n de color en EGA$'
  18. Prog2 db '.\colorega.exe', 0
  19. Desc3 db 'Efectos de color en VGA$'
  20. Prog3 db '.\colorvga.exe', 0        
  21.        
  22. ; Tabla de punteros a las
  23. ; cadenas con anteriores
  24. TblPunteros dw Desc1, Prog1
  25.             dw Desc2, Prog2
  26.             dw Desc3, Prog3
  27.  
  28. ; Bloque de parámetros para
  29. ; el servicio 4Bh de la int 21h
  30. BloqueParametros
  31.    dw 0&#59; usar entorno del DOS
  32.    dd LineaComandos&#59; cadena de parámetros
  33.    dd FCB1, FCB2&#59; FCBs  
  34.    
  35. ; La cadena de parámetros está vacía
  36. LineaComandos db 0,13        
  37. ; como los FCB
  38. FCB1 resb 20
  39. FCB2 resb 20
  40.        
  41. ; Esta etiqueta marca el
  42. ; fin del segmento de datos        
  43. FinDatos        
  44.  
  45.        &#59; Segmento de código
  46.         segment Codigo
  47. ..start:
  48.  
  49.        &#59; Configuramos los
  50.        &#59; registros de pila
  51.         mov ax, Pila
  52.         mov ss, ax
  53.         mov sp, FinPila
  54.        
  55.        &#59; y los registros de
  56.        &#59; segmento de datos
  57.         mov ax, Datos
  58.         mov ds, ax
  59.      
  60.        &#59; Ajustamos la memoria
  61.        &#59; asignada a justo la
  62.        &#59; que necesitamos
  63.         call AjustaMemoria
  64.  
  65.        &#59; Hacer que ES también
  66.        &#59; apunte a los datos
  67.         push ds
  68.         pop es
  69.                    
  70.        &#59; obtenemos el contador
  71.        &#59; de programas a ejecutar
  72.         mov cx, [NumProgramas]
  73.        
  74.        &#59; BX apunta a la tabla
  75.        &#59; de punteros a cadenas
  76.         mov bx, TblPunteros
  77.        
  78. Bucle:
  79.        &#59; obtenemos en DX la
  80.        &#59; dirección de una cadena
  81.        &#59; con la descripción del
  82.        &#59; programa a ejecutar
  83.         mov dx, [bx]        
  84.        
  85.        &#59; la mostramos
  86.         mov ah, 9
  87.         int 21h
  88.        
  89.        &#59; y esperamos una tecla
  90.         mov ah, 0Ch
  91.         mov al, 7
  92.         int 21h
  93.        
  94.        &#59; nos desplazamos al
  95.        &#59; siguiente puntero
  96.         add bx, 2
  97.        
  98.        &#59; recuperamos la dirección
  99.        &#59; del nombre del programa
  100.         mov dx, [bx]
  101.        
  102.        &#59; lo ejecutamos
  103.         call Ejecuta
  104.        
  105.        &#59; pasamos al siguiente puntero
  106.         add bx, 2
  107.        
  108.        &#59; y repetimos el proceso
  109.         loop Bucle
  110.        
  111.        &#59; Devolvemos el control
  112.        &#59; al sistema
  113.         mov ah, 4ch
  114.         int 21h
  115.  
  116. ;-------------------------------
  117. ; Esta rutina calcula la memoria
  118. ; que necesita el programa y
  119. ; reajusta el bloque asignado
  120. ; por el sistema.
  121. ; Es importante no haber modificado
  122. ; el contenido del registro ES
  123. ; antes de llamar a esta rutina
  124. ;-------------------------------
  125. AjustaMemoria:
  126.         &#59; Tomamos en BX la dirección
  127.         &#59; del final del código más
  128.         &#59; 256 bytes del PSP
  129.          mov bx,FinCodigo+256
  130.         &#59; le añadimos lo que ocupa
  131.         &#59; el segmento de pila
  132.          add bx, FinPila
  133.         &#59; y también lo que ocupa
  134.         &#59; el segmento de datos
  135.          add bx, FinDatos
  136.          
  137.         &#59; dividimos entre 16 para
  138.         &#59; convertir a párrafos
  139.          shr bx,4
  140.          
  141.         &#59; sumamos un párrafo por
  142.         &#59; cada segmento que tenemos:
  143.         &#59; pila, datos y código, para
  144.         &#59; compensar los ajutes
  145.          add bx, 3
  146.          
  147.         &#59; redimensionamos el bloque
  148.         &#59; de memoria asignado
  149.          mov ah,4ah  
  150.          int 21h    
  151.          
  152.         &#59; y volvemos
  153.          ret
  154.        
  155. ;----------------------------------
  156. ; Esta rutina recibe en DX la
  157. ; dirección de una cadena con el
  158. ; nombre del programa a ejecutar
  159. ;----------------------------------        
  160. Ejecuta:
  161.        &#59; guardamos registros
  162.         push ds
  163.         push es
  164.         pusha
  165.  
  166.        &#59; ponemos AL a 0 para indicar
  167.        &#59; que deseamos ejecutar
  168.         xor al, al
  169.        
  170.        &#59; número del servicio
  171.         mov ah, 4Bh
  172.        
  173.        &#59; DS:DX ya tiene la dirección
  174.        &#59; del nombre del programa
  175.        &#59; ES:BX debe apuntar al
  176.        &#59; bloque de parámetros
  177.        
  178.        &#59; dirección del bloque
  179.         mov bx, BloqueParametros
  180.        &#59; ejecutamos
  181.         int 21h
  182.        
  183.        &#59; recuperamos los registros
  184.         popa
  185.         pop es
  186.         pop ds
  187.        
  188.         ret&#59; y volvemos
  189.        
  190. ; Esta etiqueta marca el final
  191. ; del segmento de código        
  192. FinCodigo:                
  193.  
  194.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Exec
« Respuesta #2 en: Miércoles 31 de Mayo de 2006, 01:12 »
0
;)
Wow pues lo voy a checar
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]