Сообщение от
ibx
Взял из примеров весьма нужную функцию - two_word_to_real
Великолепно работает, но сам код не понял. Если можно поподробней разъясните пожалуйста.
FUNCTION two_word_to_real : REAL
VAR_INPUT
IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float*)
END_VAR
VAR
p1: POINTER TO BYTE;
p2: POINTER TO BYTE;
END_VAR
p1:=ADR(two_word_to_real);
p2:=ADR(IN_Data^[1]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
p1:=p1+1;
p2:=ADR(IN_Data^[0]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
Если коротко, то массив из двух регистров имеет 4 байта в следующей последовательности
1-й байт, 2-й байт, 3-й байт, 4-й байт
После выполнения функции последовательность будет такая
3-й байт, 4-й байт, 1-й байт, 2-й байт
Код:
FUNCTION two_word_to_real : REAL
VAR_INPUT
IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float (всего 4 байта)*)
END_VAR
VAR
p1: POINTER TO BYTE; (указатель на результат функции)
p2: POINTER TO BYTE; (*указатель на массив регистров*)
END_VAR
p1:=ADR(two_word_to_real); (*указатель на начало результата функции (1-й байт)*)
p2:=ADR(IN_Data^[1]); (*указатель на второй элемент массива (3-й байт) *)
p1^:=p2^; (*копируем содержимое по адресу второго указателя в адрес первого указателя *)
p1:=p1+1; (*смещаем адрес на 1 байт, теперь он указывает на 2-й байт результата*)
p2:=p2+1; (*смещаем адрес на 1 байт, теперь он указывает на 4-й байт массива*)
p1^:=p2^; (*копируем содержимое по адресу второго указателя в адрес первого указателя *)
p1:=p1+1; (*смещаем адрес на 1 байт, теперь он указывает на 3-й байт результата*)
p2:=ADR(IN_Data^[0]); (*указатель на первый элемент массива (1-й байт) *)
p1^:=p2^; (*копируем содержимое по адресу второго указателя в адрес первого указателя *)
p1:=p1+1; (*смещаем адрес на 1 байт, теперь он указывает на 4-й байт результата*)
p2:=p2+1; (*смещаем адрес на 1 байт, теперь он указывает на 2-й байт массива*)
p1^:=p2^; (*копируем содержимое по адресу второго указателя в адрес первого указателя *)