Ваша проблема в том, как найти начало и конец сегмента данных. Я не уверен, как это сделать, но я мог бы дать вам пару идей.
Если все ваши данные относительно автономны (они объявлены в одном и том же модуле, а не в отдельных модулях), вы можете объявить их в какой-то структуре, поэтому началом будет адрес структура, и конец будет некоторой переменной, которую вы объявите сразу после структуры. Если я хорошо помню, у MASM была директива «RECORD» или что-то подобное, что вы могли бы использовать для группировки переменных.
В качестве альтернативы, вы можете объявить два дополнительных модуля, один с переменной «начало», а другой с переменной «конец», и убедиться, что первый связан раньше всего, а второй связан после всего остального. Таким образом, эти переменные могут на самом деле помечать начало и конец сегмента данных. Но я не уверен в этом, я просто даю вам указатель.
Следует помнить, что ваши данные неизбежно будут содержать указатели, поэтому сохранение и загрузка всех ваших данных будут работать только в том случае, если ОС, в которой вы работаете, может гарантировать, что ваша программа всегда будет загружаться по одному и тому же адресу. Если нет, забудь об этом. Но если вы можете иметь эту гарантию, тогда да, загрузка данных должна работать. Вам даже не понадобится memcpy, просто установите буфер для операции чтения как начало сегмента данных.