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

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

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

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

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

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

.include "my-macro" # подключение файла с макроопределениями
#.include "/usr/include/errno.h"

#       Указание имен функций как внешних для редактирования #  связей с помощью компилятора 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

#       Вызовы scanf для ввода значений 16 битовых целых #      m и n, форматная строка fmth

        Puts "Введите m:"
        pushl $m        # 2 параметр - адрес переменной
        pushl $fmth     # 1 параметр - адрес форматной строки
        call scanf
        addl $8, %esp   # очистка стека

        Puts "Введите n:"
        pushl $n        # 2 параметр - адрес переменной
        pushl $fmth     # 1 параметр - адрес форматной строки
        call scanf
        addl $8, %esp   # очистка стека

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

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

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

        Puts "m + n ="
        pushl p              # 2 параметр - значение
        pushl $fmthE         # 1 параметр - адрес форматной строки
        call printf          #
        addl $8, %esp        # очистка стека



#       Вызовы scanf  для ввода значений 32 #       битовых целых l и k, форматная строка fmtl

        Puts "Введите l:"
        pushl $l        # 2 параметр - адрес переменной
        pushl $fmtl     # 1 параметр - адрес форматной строки
        call scanf
        addl $8, %esp   # очистка стека

        Puts "Введите k:"
        pushl $k        # 2 параметр - адрес переменной
        pushl $fmtl     # 1 параметр - адрес форматной строки
        call scanf
        addl $8, %esp   # очистка стека

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

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

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

        Puts "l + k ="
        pushl p              # 2 параметр - значение
        pushl $fmtp          # 1 параметр - адрес форматной строки
        call printf          #
        addl $8, %esp        # очистка стека


        Finish 
.end
