Процедура - это подпрограмма, которая решает какую-то небольшую законченную задачу внутри основной. Применяется, когда некоторый набор действий необходимо выполнить несколько раз.
Функция - частный случай процедуры, всегда возвращает какое-то конкретное значение.
По структуре процедуры и функции совпадают с основной программой, т.е. в них могут присутствовать все те же разделы. Отличаются первой строкой.
Процедура
PROCEDURE <список формальных параметров>;
FUNCTION <список формальных параметров>;

Формальные параметры - это некоторые шаблоны, которые получают свои значения из самой программы.
Процедуры и функции могут быть использованы в программе любое количество раз. Вызываются по имени и в скобках указываются фактические значения параметров. Процедура может и не иметь параметров.
Рассмотрим ваш пример:
Program Mas;

Type
g: array [1..n] of integer;
v: array [1..m] of integer;
Var
n,m,S1,S2:integer;
Begin
writeln('Введите n');
readln(n);
writeln('Введите m');
readln(m);
Randomize;
For I := 1 to n do g[I] := Random(500); {Ввод массива повторяется несколько раз, поэтому можем описать процедуру ввода}
For I := 1 to m do v[I] := Random(500);

...
Эта часть прогаммы примет следующий вид:
Program Mas;
const nm=25;
Type
mas=array [1..nm] of integer; {опишем новый тип и определим две переменные этого типа}
Var
g,v:mas;
n,m,S1,S2:integer;
Procedure Vvod(var x:mas,n:byte); {слово var показывает, что x - изменяемая величина}
begin
For I := 1 to n do x[I] := Random(500);
end;
Begin
Randomize;
writeln('Введите n');
readln(n);
Vvod(g,n); {вызываем процедуру}
writeln('Введите m');
readln(m);
vvod(v,m);
...

Дальше попробуйте сами.