section .data
; Входные данные
num1 db 0x12, 0x34, 0x56, 0x78 ; Первое число (4 байта)
num2 db 0x9A, 0xBC, 0xDE, 0xF0 ; Второе число (4 байта)
result times 4 db 0 ; Результат (4 байта)
; Константы
N equ 4 ; Размер чисел в байтах
; Строки для вывода
msg_result db "Результат: ", 0
newline db 10, 0
hex_chars db "0123456789ABCDEF"
; Промежуточные буферы
hex_buffer times (N*2+1) db 0 ; Буфер для hex-строки
section .bss
; Переменные для хранения CF
carry_flag resb 1
section .text
global _start
; ============================================
; Вычитание чисел размером N байтов с учетом знака
; ============================================
_start:
; Вычитаем num2 из num1 (результат = num1 - num2)
call subtract_big_numbers
; Выводим результат в консоль
call print_result
; Завершаем программу
mov rax, 60 ; sys_exit
xor rdi, rdi ; код 0
syscall
; ============================================
; Процедура вычитания больших чисел
; ============================================
subtract_big_numbers:
mov rcx, N ; Счетчик байтов
clc ; Сброс флага переноса (CF = 0)
subtract_loop:
mov al, [num1 + rcx - 1] ; Берем байт из num1
sbb al, [num2 + rcx - 1] ; Вычитаем с заемом байт из num2
mov [result + rcx - 1], al ; Сохраняем результат
loop subtract_loop ; Повторяем для всех байтов
; Сохраняем флаг переноса для анализа переполнения
pushf
pop rax
and al, 1 ; Извлекаем только бит CF
mov [carry_flag], al
ret
; ============================================
; Процедура вывода результата
; ============================================
print_result:
; Выводим сообщение "Результат: "
mov rsi, msg_result
call print_string
; Конвертируем результат в hex-строку
mov rsi, result
mov rdi, hex_buffer
mov rcx, N
call bytes_to_hex
; Выводим hex-строку
mov rsi, hex_buffer
call print_string
; Выводим перевод строки
mov rsi, newline
call print_string
; Определяем знак результата
call analyze_result
ret
; ============================================
; Конвертация байтов в hex-строку
; Вход: RSI = указатель на байты
; RDI = указатель на буфер
; RCX = количество байтов
; ============================================
bytes_to_hex:
push rcx
push rsi
push rdi
add rdi, rcx ; Начинаем с конца буфера для прямого порядка
add rdi, rcx
mov byte [rdi], 0 ; Нуль-терминатор
convert_loop:
dec rdi
mov al, [rsi + rcx - 1]
mov bl, al
; Младшая тетрада
and al, 0x0F
mov al, [hex_chars + rax]
mov [rdi], al
dec rdi
; Старшая тетрада
shr bl, 4
and bl, 0x0F
mov bl, [hex_chars + rbx]
mov [rdi], bl
dec rcx
jnz convert_loop
pop rdi
pop rsi
pop rcx
ret
; ============================================
; Анализ и вывод информации о результате
; ============================================
analyze_result:
; Проверяем на переполнение (OF)
mov al, [result + N - 1] ; Берем старший байт
test al, 0x80 ; Проверяем знаковый бит
jz positive_result
negative_result:
; Если результат отрицательный
mov rsi, msg_negative
call print_string
jmp check_carry
positive_result:
mov rsi, msg_positive
call print_string
check_carry:
mov al, [carry_flag]
test al, al
jz no_carry
; Был заем
mov rsi, msg_borrow
call print_string
ret
no_carry:
mov rsi, msg_no_borrow
call print_string
ret
; ============================================
; Вывод строки
; Вход: RSI = указатель на строку (нуль-терминированную)
; ============================================
print_string:
push rax
push rdi
push rdx
push rsi
; Вычисляем длину строки
mov rdi, rsi
xor rcx, rcx
not rcx
xor al, al
cld
repne scasb
not rcx
dec rcx
; Выводим строку
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rdx, rcx ; длина строки
syscall
pop rsi
pop rdx
pop rdi
pop rax
ret
section .data
msg_positive db " (Положительное число)", 10, 0
msg_negative db " (Отрицательное число, представлено в доп. коде)", 10, 0
msg_borrow db "Был заем (CF=1)", 10, 0
msg_no_borrow db "Заема не было (CF=0)", 10, 0
c2VjdGlvbiAuZGF0YQogICAgOyDQktGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUKICAgIG51bTEgZGIgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCAgICAgOyDQn9C10YDQstC+0LUg0YfQuNGB0LvQviAoNCDQsdCw0LnRgtCwKQogICAgbnVtMiBkYiAweDlBLCAweEJDLCAweERFLCAweEYwICAgICA7INCS0YLQvtGA0L7QtSDRh9C40YHQu9C+ICg0INCx0LDQudGC0LApCiAgICByZXN1bHQgdGltZXMgNCBkYiAwICAgICAgICAgICAgICAgIDsg0KDQtdC30YPQu9GM0YLQsNGCICg0INCx0LDQudGC0LApCiAgICAKICAgIDsg0JrQvtC90YHRgtCw0L3RgtGLCiAgICBOIGVxdSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KDQsNC30LzQtdGAINGH0LjRgdC10Lsg0LIg0LHQsNC50YLQsNGFCiAgICAKICAgIDsg0KHRgtGA0L7QutC4INC00LvRjyDQstGL0LLQvtC00LAKICAgIG1zZ19yZXN1bHQgZGIgItCg0LXQt9GD0LvRjNGC0LDRgjogIiwgMAogICAgbmV3bGluZSBkYiAxMCwgMAogICAgaGV4X2NoYXJzIGRiICIwMTIzNDU2Nzg5QUJDREVGIgogICAgCiAgICA7INCf0YDQvtC80LXQttGD0YLQvtGH0L3Ri9C1INCx0YPRhNC10YDRiwogICAgaGV4X2J1ZmZlciB0aW1lcyAoTioyKzEpIGRiIDAgICAgICA7INCR0YPRhNC10YAg0LTQu9GPIGhleC3RgdGC0YDQvtC60LgKCnNlY3Rpb24gLmJzcwogICAgOyDQn9C10YDQtdC80LXQvdC90YvQtSDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyBDRgogICAgY2FycnlfZmxhZyByZXNiIDEKCnNlY3Rpb24gLnRleHQKICAgIGdsb2JhbCBfc3RhcnQKCjsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOyDQktGL0YfQuNGC0LDQvdC40LUg0YfQuNGB0LXQuyDRgNCw0LfQvNC10YDQvtC8IE4g0LHQsNC50YLQvtCyINGBINGD0YfQtdGC0L7QvCDQt9C90LDQutCwCjsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCl9zdGFydDoKICAgIDsg0JLRi9GH0LjRgtCw0LXQvCBudW0yINC40LcgbnVtMSAo0YDQtdC30YPQu9GM0YLQsNGCID0gbnVtMSAtIG51bTIpCiAgICBjYWxsIHN1YnRyYWN0X2JpZ19udW1iZXJzCiAgICAKICAgIDsg0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCINCyINC60L7QvdGB0L7Qu9GMCiAgICBjYWxsIHByaW50X3Jlc3VsdAogICAgCiAgICA7INCX0LDQstC10YDRiNCw0LXQvCDQv9GA0L7Qs9GA0LDQvNC80YMKICAgIG1vdiByYXgsIDYwICAgICAgICA7IHN5c19leGl0CiAgICB4b3IgcmRpLCByZGkgICAgICAgOyDQutC+0LQgMAogICAgc3lzY2FsbAoKOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo7INCf0YDQvtGG0LXQtNGD0YDQsCDQstGL0YfQuNGC0LDQvdC40Y8g0LHQvtC70YzRiNC40YUg0YfQuNGB0LXQuwo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN1YnRyYWN0X2JpZ19udW1iZXJzOgogICAgbW92IHJjeCwgTiAgICAgICAgICA7INCh0YfQtdGC0YfQuNC6INCx0LDQudGC0L7QsgogICAgY2xjICAgICAgICAgICAgICAgICA7INCh0LHRgNC+0YEg0YTQu9Cw0LPQsCDQv9C10YDQtdC90L7RgdCwIChDRiA9IDApCiAgICAKc3VidHJhY3RfbG9vcDoKICAgIG1vdiBhbCwgW251bTEgKyByY3ggLSAxXSAgIDsg0JHQtdGA0LXQvCDQsdCw0LnRgiDQuNC3IG51bTEKICAgIHNiYiBhbCwgW251bTIgKyByY3ggLSAxXSAgIDsg0JLRi9GH0LjRgtCw0LXQvCDRgSDQt9Cw0LXQvNC+0Lwg0LHQsNC50YIg0LjQtyBudW0yCiAgICBtb3YgW3Jlc3VsdCArIHJjeCAtIDFdLCBhbCA7INCh0L7RhdGA0LDQvdGP0LXQvCDRgNC10LfRg9C70YzRgtCw0YIKICAgIGxvb3Agc3VidHJhY3RfbG9vcCAgICAgICAgIDsg0J/QvtCy0YLQvtGA0Y/QtdC8INC00LvRjyDQstGB0LXRhSDQsdCw0LnRgtC+0LIKICAgIAogICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0YTQu9Cw0LMg0L/QtdGA0LXQvdC+0YHQsCDQtNC70Y8g0LDQvdCw0LvQuNC30LAg0L/QtdGA0LXQv9C+0LvQvdC10L3QuNGPCiAgICBwdXNoZgogICAgcG9wIHJheAogICAgYW5kIGFsLCAxICAgICAgICAgICAgICAgICAgOyDQmNC30LLQu9C10LrQsNC10Lwg0YLQvtC70YzQutC+INCx0LjRgiBDRgogICAgbW92IFtjYXJyeV9mbGFnXSwgYWwKICAgIAogICAgcmV0Cgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cjsg0J/RgNC+0YbQtdC00YPRgNCwINCy0YvQstC+0LTQsCDRgNC10LfRg9C70YzRgtCw0YLQsAo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnByaW50X3Jlc3VsdDoKICAgIDsg0JLRi9Cy0L7QtNC40Lwg0YHQvtC+0LHRidC10L3QuNC1ICLQoNC10LfRg9C70YzRgtCw0YI6ICIKICAgIG1vdiByc2ksIG1zZ19yZXN1bHQKICAgIGNhbGwgcHJpbnRfc3RyaW5nCiAgICAKICAgIDsg0JrQvtC90LLQtdGA0YLQuNGA0YPQtdC8INGA0LXQt9GD0LvRjNGC0LDRgiDQsiBoZXgt0YHRgtGA0L7QutGDCiAgICBtb3YgcnNpLCByZXN1bHQKICAgIG1vdiByZGksIGhleF9idWZmZXIKICAgIG1vdiByY3gsIE4KICAgIGNhbGwgYnl0ZXNfdG9faGV4CiAgICAKICAgIDsg0JLRi9Cy0L7QtNC40LwgaGV4LdGB0YLRgNC+0LrRgwogICAgbW92IHJzaSwgaGV4X2J1ZmZlcgogICAgY2FsbCBwcmludF9zdHJpbmcKICAgIAogICAgOyDQktGL0LLQvtC00LjQvCDQv9C10YDQtdCy0L7QtCDRgdGC0YDQvtC60LgKICAgIG1vdiByc2ksIG5ld2xpbmUKICAgIGNhbGwgcHJpbnRfc3RyaW5nCiAgICAKICAgIDsg0J7Qv9GA0LXQtNC10LvRj9C10Lwg0LfQvdCw0Log0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIGNhbGwgYW5hbHl6ZV9yZXN1bHQKICAgIAogICAgcmV0Cgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cjsg0JrQvtC90LLQtdGA0YLQsNGG0LjRjyDQsdCw0LnRgtC+0LIg0LIgaGV4LdGB0YLRgNC+0LrRgwo7INCS0YXQvtC0OiBSU0kgPSDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQsdCw0LnRgtGLCjsgICAgICAgUkRJID0g0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0LHRg9GE0LXRgAo7ICAgICAgIFJDWCA9INC60L7Qu9C40YfQtdGB0YLQstC+INCx0LDQudGC0L7Qsgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmJ5dGVzX3RvX2hleDoKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJzaQogICAgcHVzaCByZGkKICAgIAogICAgYWRkIHJkaSwgcmN4ICAgICAgIDsg0J3QsNGH0LjQvdCw0LXQvCDRgSDQutC+0L3RhtCwINCx0YPRhNC10YDQsCDQtNC70Y8g0L/RgNGP0LzQvtCz0L4g0L/QvtGA0Y/QtNC60LAKICAgIGFkZCByZGksIHJjeAogICAgbW92IGJ5dGUgW3JkaV0sIDAgIDsg0J3Rg9C70Ywt0YLQtdGA0LzQuNC90LDRgtC+0YAKICAgIApjb252ZXJ0X2xvb3A6CiAgICBkZWMgcmRpCiAgICBtb3YgYWwsIFtyc2kgKyByY3ggLSAxXQogICAgbW92IGJsLCBhbAogICAgCiAgICA7INCc0LvQsNC00YjQsNGPINGC0LXRgtGA0LDQtNCwCiAgICBhbmQgYWwsIDB4MEYKICAgIG1vdiBhbCwgW2hleF9jaGFycyArIHJheF0KICAgIG1vdiBbcmRpXSwgYWwKICAgIGRlYyByZGkKICAgIAogICAgOyDQodGC0LDRgNGI0LDRjyDRgtC10YLRgNCw0LTQsAogICAgc2hyIGJsLCA0CiAgICBhbmQgYmwsIDB4MEYKICAgIG1vdiBibCwgW2hleF9jaGFycyArIHJieF0KICAgIG1vdiBbcmRpXSwgYmwKICAgIAogICAgZGVjIHJjeAogICAgam56IGNvbnZlcnRfbG9vcAogICAgCiAgICBwb3AgcmRpCiAgICBwb3AgcnNpCiAgICBwb3AgcmN4CiAgICByZXQKCjsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOyDQkNC90LDQu9C40Lcg0Lgg0LLRi9Cy0L7QtCDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviDRgNC10LfRg9C70YzRgtCw0YLQtQo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmFuYWx5emVfcmVzdWx0OgogICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0L3QsCDQv9C10YDQtdC/0L7Qu9C90LXQvdC40LUgKE9GKQogICAgbW92IGFsLCBbcmVzdWx0ICsgTiAtIDFdICA7INCR0LXRgNC10Lwg0YHRgtCw0YDRiNC40Lkg0LHQsNC50YIKICAgIHRlc3QgYWwsIDB4ODAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0LfQvdCw0LrQvtCy0YvQuSDQsdC40YIKICAgIGp6IHBvc2l0aXZlX3Jlc3VsdAogICAgCm5lZ2F0aXZlX3Jlc3VsdDoKICAgIDsg0JXRgdC70Lgg0YDQtdC30YPQu9GM0YLQsNGCINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C5CiAgICBtb3YgcnNpLCBtc2dfbmVnYXRpdmUKICAgIGNhbGwgcHJpbnRfc3RyaW5nCiAgICBqbXAgY2hlY2tfY2FycnkKCnBvc2l0aXZlX3Jlc3VsdDoKICAgIG1vdiByc2ksIG1zZ19wb3NpdGl2ZQogICAgY2FsbCBwcmludF9zdHJpbmcKCmNoZWNrX2NhcnJ5OgogICAgbW92IGFsLCBbY2FycnlfZmxhZ10KICAgIHRlc3QgYWwsIGFsCiAgICBqeiBub19jYXJyeQogICAgCiAgICA7INCR0YvQuyDQt9Cw0LXQvAogICAgbW92IHJzaSwgbXNnX2JvcnJvdwogICAgY2FsbCBwcmludF9zdHJpbmcKICAgIHJldAogICAgCm5vX2NhcnJ5OgogICAgbW92IHJzaSwgbXNnX25vX2JvcnJvdwogICAgY2FsbCBwcmludF9zdHJpbmcKICAgIHJldAoKOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo7INCS0YvQstC+0LQg0YHRgtGA0L7QutC4Cjsg0JLRhdC+0LQ6IFJTSSA9INGD0LrQsNC30LDRgtC10LvRjCDQvdCwINGB0YLRgNC+0LrRgyAo0L3Rg9C70Ywt0YLQtdGA0LzQuNC90LjRgNC+0LLQsNC90L3Rg9GOKQo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnByaW50X3N0cmluZzoKICAgIHB1c2ggcmF4CiAgICBwdXNoIHJkaQogICAgcHVzaCByZHgKICAgIHB1c2ggcnNpCiAgICAKICAgIDsg0JLRi9GH0LjRgdC70Y/QtdC8INC00LvQuNC90YMg0YHRgtGA0L7QutC4CiAgICBtb3YgcmRpLCByc2kKICAgIHhvciByY3gsIHJjeAogICAgbm90IHJjeAogICAgeG9yIGFsLCBhbAogICAgY2xkCiAgICByZXBuZSBzY2FzYgogICAgbm90IHJjeAogICAgZGVjIHJjeAogICAgCiAgICA7INCS0YvQstC+0LTQuNC8INGB0YLRgNC+0LrRgwogICAgbW92IHJheCwgMSAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiByZGksIDEgICAgICAgIDsgc3Rkb3V0CiAgICBtb3YgcmR4LCByY3ggICAgICA7INC00LvQuNC90LAg0YHRgtGA0L7QutC4CiAgICBzeXNjYWxsCiAgICAKICAgIHBvcCByc2kKICAgIHBvcCByZHgKICAgIHBvcCByZGkKICAgIHBvcCByYXgKICAgIHJldAoKc2VjdGlvbiAuZGF0YQogICAgbXNnX3Bvc2l0aXZlIGRiICIgKNCf0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4pIiwgMTAsIDAKICAgIG1zZ19uZWdhdGl2ZSBkYiAiICjQntGC0YDQuNGG0LDRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+LCDQv9GA0LXQtNGB0YLQsNCy0LvQtdC90L4g0LIg0LTQvtC/LiDQutC+0LTQtSkiLCAxMCwgMAogICAgbXNnX2JvcnJvdyBkYiAi0JHRi9C7INC30LDQtdC8IChDRj0xKSIsIDEwLCAwCiAgICBtc2dfbm9fYm9ycm93IGRiICLQl9Cw0LXQvNCwINC90LUg0LHRi9C70L4gKENGPTApIiwgMTAsIDA=