Pascal/Turbo Pascal - Programacion hibrida en free pascal?

 
Vista:

Programacion hibrida en free pascal?

Publicado por Franco Sanguedolce (32 intervenciones) el 15/11/2013 07:24:57
buenas amigos del foro, he aqui de nuevo con una duda...

estoy estudiando programacion en ASSEMBLER, lo llevo bastante bien, el tema es que, cuando quiero añadir codigo en ensamblador a algun programa en pascal solo consigo usar algunas funciones...

explico mejor...

usando la directiva {$asmmode intel} he conseguido compilar mis aplicaciones en pascal, pero cuando quiero hacer llamadas a interrupciones, ya sean de la BIOS o de DOS no consigo que el programa corra...

un ejemplo de esto es un procedimiento para cambiar a modo grafico;

1
2
3
4
5
6
procedure m640x480x16; assembler;
asm
   mov ah,00h  {Funcion que cambia el modo de video de la INT 10h}
   mov al,12h   {Especifico el modo de video 640x480x16}
   int 10h  {Llamo a la interrupcion para cambiar al modo de video}
end;

con esto deberia cambiar al modo grafico que le indico, compila bien, pero cuando lo corro, el programa se interrumpe con exitcode = 216;

probe usando las fnciones de la unidad DOS con una variable de tipo REGISTERS de la siguiente manera:

1
2
3
4
5
6
procedure m640x480x16;
begin
    regs.ah:=$00; {Funcion de la INT 10h}
    regs.al:=$12; {Modo de Video 640x480x16}
    intr($10,regs);
end;

en ambos casos el programa compila bien pero cuando lo corro se interumpe la ejecucion y me sale exitcode = 216, esto me pasa con varias rutinas que probe en ASM, segun lei por ahi, con FREE PASCAL no se pueden usar las interrupciones de Ms-Dos, aun asi, las interrupciones de la BIOS deberia poderlas ejecutar, pero el programa se interrumpe con ese codigo de error,
alguna solucion??? se los agradeceria.
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

Programacion hibrida en free pascal?

Publicado por ramon (2158 intervenciones) el 20/11/2013 12:02:36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
{Mira esta es la forma que freepascal interpreta los programas en asm pero freepascal actual
tiene problemas dando el error 216 te aconsejo que si quieres usar asm con pascal te bajes
pascal 7 que no te dará ningún problema y es gratis trabaja con windows 7 32 bit sin fallos en
pantalla completa o ventana }
 
program pruevaams;
 uses
    crt;
   {$mode objfpc}
   {$S-}
  const
   rm_unknown = 0;
   rm_raw     = 1;
   rm_xms     = 2;
   rm_vcpi    = 3;
   rm_dpmi    = 4;
   carryflag     = $001;
   parityflag    = $004;
   auxcarryflag  = $010;
   zeroflag      = $040;
   signflag      = $080;
   trapflag      = $100;
   interruptflag = $200;
   directionflag = $400;
   overflowflag  = $800;
 
    type
       tmeminfo = record
          available_memory,
          available_pages,
          available_lockable_pages,
          linear_space,
          unlocked_pages,
          available_physical_pages,
          total_physical_pages,
          free_linear_space,
          max_pages_in_paging_file,
          reserved0,
          reserved1,
          reserved2 : longint;
       end;
 
       tseginfo = record
          offset  : pointer;
          segment : word;
       end;
 
    trealregs = record
         case integer of
          1: { 32-bit } (EDI, ESI, EBP, Res, EBX, EDX, ECX, EAX: longint;
                         Flags, ES, DS, FS, GS, IP, CS, SP, SS: word);
          2: { 16-bit } (DI, DI2, SI, SI2, BP, BP2, R1, R2: word;
                         BX, BX2, DX, DX2, CX, CX2, AX, AX2: word);
          3: { 8-bit }  (stuff: array[1..4] of longint;
                         BL, BH, BL2, BH2, DL, DH, DL2, DH2,
                         CL, CH, CL2, CH2, AL, AH, AL2, AH2: byte);
          4: { Compat } (RealEDI, RealESI, RealEBP, RealRES,
                         RealEBX, RealEDX, RealECX, RealEAX: longint;
                         RealFlags,
                         RealES, RealDS, RealFS, RealGS,
                         RealIP, RealCS, RealSP, RealSS: word);
       end;
 
    registers = trealregs;
 
 
     var
       dosmemselector : word;
       int31error : word;
       informe : tmeminfo;
 
 
 
  function realintr(intnr : word;var regs : trealregs) : boolean;
 
      begin
         regs.realsp:=0;
         regs.realss:=0;
         asm
            movw  intnr,%bx
            xorl  %ecx,%ecx
            movl  regs,%edi
            { es is always equal ds }
            movl  $0x300,%eax
            int   $0x31
            setnc %al
            movb  %al,__RESULT
         end;
      end;
 
 
   procedure test_int31(flag : longint);[alias : 'test_int31'];
      begin
         asm
            pushl %ebx
            movw  $0,INT31ERROR
            movl  flag,%ebx
            testb $1,%bl
            jz    .L1
            movw  %ax,INT31ERROR
            xorl  %eax,%eax
            jmp   .L2
            .L1:
            movl  $1,%eax
            .L2:
            popl  %ebx
         end;
      end;
 
    function get_meminfo(var meminfo : tmeminfo) : boolean;
      begin
         asm
            movl meminfo,%edi
            movl $0x500,%eax
            int $0x31
            pushf
            movb %al,__RESULT
            call test_int31
         end;
      end;
 
  begin
      writeln(get_meminfo(informe));
      readkey;
  end.
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