#    Применние соглашений о свзях для вызов функций printf и scanf,
#    входящих в библиотеку glibc

#    В примере покзан ввод и вывод 16 и 32 битовых ЗНАКОВЫХ 
#    целых чисел

#    Прототипы из man:

#    Параметр формата для обоих функций  передается как адрес (указатель)

#    int scanf(const char *format, *p1, *p2, ...);
#     параметры после формата - адреса (указатели)
	
#    int printf(const char *format, p1, p2, ...);
#     параметры после формата - сами значения для печати

#	Подключение макроопределения Exit, Getchar, Puts, Finish
.include "my-macro" 

#	Подключение макроопределений Input (для scanf) и Output (для printf)
.include "libc-macro" 

#	Указание имен функций как внешних для редактирования 
#	связей с помощью компилятора gсс, в который встроены 
#       имя файла библиотеки glibc и путь к ней.

.extern scanf	
.extern printf

.data 

m:	.short  0
n:	.short  0
l:	.long	0
k:	.long	0
p: 	.long   0

#	Форматные строки для передачи их адресов как параметров

fmth:
        .string "%hd" 	# scanf: h - 16 бит, d - знаковое целое

fmthE:
        .string "%hd\n"	# printf

fmtl:
        .string "%ld" 	# scanf: l - 32 бита, d - знаковое целое 

fmtp:
	.string "%ld\n"  # printf 
	

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

.global main # точка входа - глобальная метка, ОБЯЗАТЕЛЬНО MAIN

main:
	nop

#	Ввод значений 16 битовых целых m и n    

	Puts "Введите m:"
	Input m fmth

	Puts "Введите n:"
	Input n fmth

#	получение суммы m и n

        movl %edx, %edx
	addw m, %dx
	addw n, %dx
	movl %edx,p

#	печать суммы

        Puts "m + n ="
        Output p fmthE


#	Ввод значений 32 битовых целых l и k        

	Puts "Введите l:"
	Input l fmtl

	Puts "Введите k:"
	Input k fmtl

#	получение суммы k и l

        subl %edx, %edx
	addl k, %edx
	addl l, %edx
	movl %edx, p

        Puts "l + k ="
        Output p fmtp

	Finish 			
.end   				
	
