Лекс Айрин писал(а):выделяется в куче адрес, а потом по нему выкладывается строка
Никаких куч для литералов.
- Код: Выделить всё
{$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