Многомодульные программы. Способ передачи параметров функциями языка Си, страница 3

Тип функции

Размер в байтах

Регистр(ы)

Boolean

1

al

Char

1

al

Enumerated (8 bit)

1

al

Enumerated (16 bit)

2

ax

Shortlnt

1

al

Byte

1

al

Integer

2

ax

Word

2

ax

Longint

4

dx:ax

Single

В вершине стека FPU

Double

В вершине стека FPU

Real words

6

dx:bx:ax

Extended

В вершине стека FPU

Comp

В вершине стека FPU

Pointer

4

dx=seg, ax=offset

String

Указатель в стеке

Пример.

Эта программа имеет процедуры, которые написаны на ассемблере и производят преобразование строки, определенной по правилам языка Паскаль, в строку, определенную по правилам языка Си и наоборот. В основной программе производится преобразование тестовой строки из одного типа в другой и её печать.

PROGRAM StringConversion;

TYPE  ASCIIZString = ARRAY [0..255] OF Char;

VAR   a:ASCIIZString;

s:String;

{$L STRTOASC.OBJ}

PROCEDURE ASCIIZtoStr(a:ASCIIZString; VAR s:String); EXTERNAL;

(*

VAR len:integer;

BEGIN

Len:=0;

While (len<255) AND (a[len]<>Chr(0)) DO

BEGIN

len:=len+1;

s[len]:=a[len-1];

END;

s[0]:=chr(len)

END;

*)

PROCEDURE StrToASCIIZ(s:String; VAR a: ASCIIZString); EXTERNAL;

(*

VAR   len,i:integer;

BEGIN

len:=length(s);

FOR i:=1 TO len DO a[i-1]:=s[i];

a[len]:=Chr(0)

END;

*)

PROCEDURE ShowASCIIZ( a:ASCIIZString);

VAR   i:integer;

BEGIN

i:=0;

WHILE (i<255) AND (a[i]<> Chr(0)) DO

BEGIN

Write(a[i]); i:=i+1

END

END;

BEGIN

s:='This is a test1';

StrToASCIIZ(s,a);

ShowASCIIZ(a);

Writeln;

s:='22';

ASCIIZtoStr(a,s);

Writeln(s)

END.

.model small,Pascal

.code

; PROCEDURE ASCIIZtoStr(a:ASCIIZString, Var s:Srting;)

PUBLIC         ASCIIZtoStr

ASCIIZtoStr  proc

ARG   a:dword,s:dword

USES  ds

les        di,s                  ; загрузили адрес приемника

push     di                    ; адрес s[0] в стек

inc       di                    ; пропустили s[0] (под длину)

lds       si,a                  ; адрес источника

cld                               ; флаг направления 0

xor       cl,cl

m1:      cmp     cl,255              ; Строка уже заполнена до конца

je         m2

lodsb                           ; Символ из источника

or         al,al

jz         m2                   ; если 0

stosb                           ; символ в приемник

inc       cl

jmp      m1

m2:      pop      di

mov     es:[di],cl          ; Длина в s[0]

ret

ASCIIZtoStr  endp

; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString)

PUBLIC         StrToASCIIZ

StrToASCIIZ proc

ARG   s:dword,a:dword

USES  ds

les        di,a                  ; приемник

lds       si,s                   ; источник

cld                               ; флаг направления 0

xor       cx,cx

lodsb                           ; Длина в al

mov     cl,al

jcxz      m3                   ; если пустая строка

repnz   movsb

m3:      mov     es:[di],cl          ; запись символа с кодом 0

ret

StrToASCIIZ endp

End

Си-Ассемблер

Преобразование типов языка Си к типам ассемблера, а также типы возвращаемых значений функциями Си и способ передачи результата представлены в следующих таблицах.

Таблица 3 Типы данных языка Си и их представление в ассемблере

Тип данных С, С++

Определитель

Байты

Директива

unsigned char

Byte ptr

1

db

Char

Byte ptr

1

db

Enum

Word ptr

2

dw

unsigned short

Word ptr

2

dw

Short

Word ptr

2

dw

unsigned int

Word ptr

2

dw

Int

Word ptr

2

dw

unsigned long

Dword ptr

4

dd

Long

Dword ptr

4

dd

Float

Dword ptr

4

dd

Double

Dword ptr

8

dq

long double

Tbyte ptr

10

dt

near*

Word ptr

2

dw

far*

Dword ptr

4

dd