Тип функции |
Размер в байтах |
Регистр(ы) |
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 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.