
# ---- добавлено для раздельной трансляции ---

# Описание внешних  символьных имен

.globl Read_Sym, Trans_Sym, Numbers, EBPm4

# ---- конец добавления ------------------ ---
	
.text	# секция команд процесора

.type	Read_Sym, @function  	# читает Symbols в цикле

#	Имеет два параметра

# P1 - число байтов для чтение из массива 
# P2 - адрес массива откуда читать

# Прочтенный байт передается в Trans_Sym. 
# Ее результат возвращается в %eax и передается
# в элементы массиве Numbers

Read_Sym:

#	Стандартный пролог 

	pushl %ebp 	 # %ebp  вызывающей -> стек
	movl  %esp, %ebp # обеспечить адресный доступ к параметрам и 
#			   локальным переменным в стеке путем базовой 
#			   адресации через ebp
	                 
.data # секция данных

LVAR1:	.ascii "LFr1" # показ локальной переменной Кадра стека 1

.text # секция команд процессора

	subl  $4, %esp	 # завести локальную перемен. в Кадре 1
        movl  LVAR1,%eax
        movl  %eax,-4(%ebp)        
        
#	Собственно Код  функции

	subl %ecx, %ecx   # иницируем цикла по байтам Symbols

#	Начало цикла 
	
NextSym:	
	movl 12(%ebp), %edx  # адрес P2 - массива в %edx

#    Подготовка вызова функции Trans_Sym

#	Ее параметр - байт передадим через %bl регистра %ebx

	subl %ebx, %ebx	# все нули 

#	- передадим код символа в %bl 
#	%edx - базовый - взяли из P2,
#	%ecx - индексный - номер цикла, MM = 1 - один байт
#	регистровая адресация

	movb (%edx,%ecx,1), %bl     

#	Параметр Trans_Sym готов, можно ее вызывать.

.data # секция данных

#	для показа мест РОН в стеке после pusha в ReadSym

EAXf1:	.ascii "axf1"	# %eax
EDIf1:	.ascii "dif1"	# %edi

.text # секция команд процессора

#	Индикаторы РОН f1 перед pusha
	
	movl EAXf1,  %eax	# первый 
	movl EDIf1,  %edi 	# последний
	movl EBPm4,  %esi	# следующий после %ebp 
				# !!! %ebp НЕ ТРОГАТЬ !!! 
	
	pusha		# сохранить РОН текущей функции Read_Sym	

	pushl %ebx   	# Параметр Trans_Sym в стек
	
	call Trans_Sym

	addl $4,%esp	# очистить стек от параметров Trans_Sym

#	Опять работает Read_Sym

#	В %eax 4 байтовый результат Trans_Sym 

#	Запись результата в массив Numbers.	

#	Базовый регистр НЕ ЗАДАН - запятая после лев. скобки
#	%ecx - индексный регистр, масштаьный множитель - 4
#	т.к. элементы Numbers - 4-х байтовые слова
#	регистровая адресация

	movl	%eax, Numbers(,%ecx,4) 
	
	popa   # восстановть регистры Read_Sym		
	
	incl %ecx	     # наращиваем счетчик цикла
	cmpl 8(%ebp), %ecx   # счетчик цикла равен первому параметру?
	
	jne NextSym	     # ДА, на повтор
			     # НЕТ - выходим из цикла

#	Стандартный эпилог функции

	movl %ebp, %esp # восстановить указатель стека
	popl %ebp       # восстановить ebp
	ret		# возврат в вызывающую

	.end   # последняя строка исходного текса	
