Лекс Айрин писал(а):выделяется в куче адрес, а потом по нему выкладывается строка
Никаких куч для литералов.
- Код: Выделить всё
- {$mode ObjFPC}{$H+}
 begin
 WriteLn(PChar('F:'))
 end.
- Код: Выделить всё
- _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 ALIGN 4
 _$PROGRAM$_Ld1 DB "F:",0
 _DATA ENDS
Добавлено спустя 7 минут 27 секунд:
FPC 3.0.2:
- Код: Выделить всё
- {$mode ObjFPC}{$H+}
 procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall;
 begin
 WriteLn(key_dev);
 end;
 begin
 InitKey(PChar('F:'), 'SomeID');
 end.
- Код: Выделить всё
- _CODE SEGMENT PARA PUBLIC USE32 'CODE'
 ALIGN 16
 PUBLIC PASCALMAIN
 PASCALMAIN:
 PUBLIC _main
 _main:
 ...
 ; [7] InitKey(PChar('F:'), 'SomeID');
 mov eax,offset _$PROGRAM$_Ld1
 push eax
 mov eax,offset _$PROGRAM$_Ld2
 push eax
 call P$PROGRAM_$$_INITKEY$PCHAR$PCHAR
 ...
 _CODE ENDS
- Код: Выделить всё
- _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 ALIGN 4
 _$PROGRAM$_Ld1 DB "SomeID",0
 _DATA ENDS
 _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 ALIGN 4
 _$PROGRAM$_Ld2 DB "F:",0
 _DATA ENDS
Добавлено спустя 22 минуты 52 секунды:
- Код: Выделить всё
- {$mode ObjFPC}{$H+}
 procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall; external 'a.dll' name 'InitKey';
 var s: String;
 begin
 s:='SomeID';
 InitKey('F:\', PChar(s));
 end.
FPC 3.0.2:
- Код: Выделить всё
- EXTRN FPC_EMPTYCHAR: NEAR
 EXTRN _$dll$a$InitKey: NEAR
 _CODE SEGMENT PARA PUBLIC USE32 'CODE'
 ALIGN 16
 PUBLIC PASCALMAIN
 PASCALMAIN:
 PUBLIC _main
 _main:
 ...
 ; [5] s:='SomeID';
 mov eax,offset _$PROGRAM$_Ld1
 mov edx,eax
 mov eax,offset U_$P$PROGRAM_$$_S
 call fpc_ansistr_assign
 ; [6] InitKey('F:\', PChar(s));
 mov eax,dword ptr [U_$P$PROGRAM_$$_S]
 test eax,eax
 jne @@j13
 mov eax,offset FPC_EMPTYCHAR
 @@j13:
 push eax
 mov eax,offset _$PROGRAM$_Ld2
 push eax
 call _$dll$a$InitKey
 ...
 _CODE ENDS
- Код: Выделить всё
- _BSS SEGMENT DWORD PUBLIC USE32 'BSS'
 ALIGN 4
 U_$P$PROGRAM_$$_S DB 4 DUP(?)
 _BSS ENDS
 _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 ALIGN 4
 DW 0,1
 DD -1,6
 _$PROGRAM$_Ld1 DB "SomeID",0
 _DATA ENDS
 _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 ALIGN 4
 _$PROGRAM$_Ld2 DB "F:\",0
 _DATA ENDS





