#    Демонстрация директив определения данных
#    Переполнение для знакового и беззнакового сложения

#    Ассемблирование и редактирование связей - команда make

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

.data # секция данных, распределение памяти

#   Строковые данные и escape последовательности

Str:    .ascii  "abc ABC 123"
Str1:   .ascii  "Две капли сверкнут, сверкнут", "на дне!\n" # escape новая строка
Str2:   .asciz  "Эфес о ладонь согреешь!"           # нулевой байт
Str3:   .ascii  "и\\или"                            # текст и\или

#   Данные основных типов

#       Использование односимвольных литералов

OneSymbol:  .int '1', '2', '3'
	    .hword '1', '2', '3'
            .byte '1
            .byte '2
            .byte '1'+'2'
            .byte '\A
            .byte '\n


#       Система счисления цеоых литералов

Diff_bases: .byte  65   # 10
           .byte  0101  # 8
           .byte  041   # 8
           .byte  0x41  # 16
           .byte  0X41  # 16

#                  8      16     10
           .long  02345, 0x4E5, 1253

#   Параметры - простые выражения

Arifm_Expression:

            .byte 35+30, 20+45
            .byte 70-5, 80-15

#   Знаковые и беззнаковые целые
#   и данные для демонстрации переполнения 


B1: 	 	.byte   255 # max беззнаковое в байте     
B2:		    .byte   240 # просто байт

Bm1:   		.byte   -1  # знаковый байт
Bp1:   		.byte   +1  # знаковый байт

B_zn_min:  	.byte   -128    # мин в знаковом байте
B_zn_max:	.byte   +127    # мах в знаковом байте

S1:     	.hword  255     # просто 16b число
S2:     	.hword  240     # просто 16b число

W_bzn_max:   	.hword  65535   # 16b беззнаковый максимум
W_zn_min:     	.hword  -32768  # 16b знаковый минимум
W_zn_max:     	.hword  +32767  # 16b знаковый максимум

L1:     	.long   4294967295  # 32b беззнаковый максимум
Il:     	.int    4294967295  # 32b беззнаковый максимум
I1:     	.int    -2147483648 # 32b знаковый минимум
I2:     	.int    +2147483647 # 32b знаковый максимум

Q:      	.quad   -2147483648 # 64b знаковый минимум

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

.global _start # точка входа 

_start:         movw    S1, %ax	# слово 255
                addw    S2, %ax	# + слово 240 = 495
            			# НЕТ переполнения

                sub     %eax,%eax
                movb    B1, %al	# байт 255
                addb    B2, %al	# + 240
                jc      UnsignedOverflowb 
                nop
                nop

UnsignedOverflowb:
                sub     %eax,%eax
                movw    W_bzn_max,%ax	# max беззнаковое слово
                addw    $1,%ax		# +1 к нему
                jc      UnsignedOverflow_w
                nop
                nop
                
UnsignedOverflow_w:
                sub     %eax,%eax
                movw    W_zn_max, %ax	# max знаковое слово
                addw    $1, %ax		# +1 к нему
                jo      SignedOverflow
                nop
                nop
SignedOverflow:
                sub     %eax, %eax
                movw    W_zn_min, %ax	# min знаковое слово
                subw    $1, %ax		# -1 от него
                jo      SignOver
                nop
                nop
SignOver:

                Finish # конец работы, возврат в ОС (макро из файла my-macro)
                .end   # последняя строка исходного текста

