Почему Ассемблер вместо суммы выводит рандомное большое число?

подскажите, пожалуйста, как сделать так, чтобы Ассемблер считал правильно. При вводе двух чисел программа должна выдавать их сумму, а на выходе получается вообще другое число.

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

.data
delta: .byte 0x30   # Переменная для получения из кода символа его числовое представление в c.c
    summ: .short 32760  # Переменная для хранения суммы 
num_system: .short 0 # Переменная для номера с.с.
count_num: .long 0 # Кол-во возможных цифр в с.с.
str_len: .long 0 # Кол-во цифр в числе для вывода   
    flag_word:   .long 0

.bss
    .lcomm c, 1               # Буфер для чтения текущего символа. Размер - 1 байт
    .lcomm out10, 6           # Буфер для вывода.
    .lcomm n, 1       # Переменная для обработки текущего символа

.text
  .global _start

_start:

  input:
    Puts "Введите цифру"
movb $'0', n

show_prompt:
    Getchar $c              # макровызов ввода символа со стандартного ввода
    Cmpl $0, %eax           # Конец файл - EOF (введено 0 символов) ?
    je stop                 # Да - вывод суммы

cmpb $'\n', c           # это символ перевода строки ?
    je plus_numb

cmpb $'9', c            # код больше кода символа '9' ?
    ja print_err            # ДА - на вывод сообщения об ошибке
    cmpb $'0', c            # код меньше кода символа '0' ?
    jb print_err            # ДА - на вывод сообщения об ошибке

    movb c, %al # Передаем значение из с в n
    movb %al, n
movl $0, flag_word

jmp show_prompt

plus_numb:
cmpl $1, flag_word
je input

xorw %ax, %ax       # Обнуление %ax для правильной обработки

    movb n, %al             # Присваеваем %al значение n

subb delta, %al     # Получаем число из кода
addw %ax, summ      # Прибавляем число к сумме
jc err_buf_over     # Проверяем на переполнение

jmp print_summ_numbers_10


print_err:
 movl $1, flag_word
 jmp show_prompt                # на ввод следующего символа

err_buf_over:   
 Puts "Произошло переполнение. Выход."  # вывод сообщения об переполнении
 jmp stop               # выход из программы

print_summ_numbers_10:
 Puts "Сумма введенных чисел в 10 с.с.: "
    movw $10, num_system  
 movw $5, count_num
jmp ToString

print_summ_numbers_8:   
 Puts "Сумма введенных чисел в 8 с.с.: "
    movw $8, num_system
movw $6, count_num
jmp ToString

print_summ_numbers_2:   
 Puts "Сумма введенных чисел в 2 с.с.: "
    movw $2, num_system
movw $16, count_num
jmp ToString

stop:
 Exit $0            # выход из программы

ToString:
    movw num_system, %bx    # Система счисления. На неё будем делить
    movl count_num, %esi    # Адрес самого первого чила. В числе <= count+1 (5 в 10 сс) чисел 
=> count
    movw summ, %ax      # Копируем номер в %ax
    xorl %edi, %edi         # Обнуляем %edi
xorl %ecx, %ecx

cmpw $0, summ
jl ToStr_begin

ToStr_begin:           # Начало цикла
 incl %ecx               # Счетчик длины строки вывода
    movl $0, %edx           # Обнуляем %edx (В нём после операции будет остаток)
    divw %bx                # Делим %ax на %bx, остаток в %dx
    addb $0x30, %dl         # Прибавляем к %dl 0x30, чтобы перейти к коду числа.
    movb %dl, out10(%esi)   # Копируем содержимое %dl в буфер по нужному смещению

    cmpw $0, %ax            # Дошли до нуля? (В %ax пусто?)
    je some_changes     # Да, заканчиваем преобразование и гоовим буфер к выводу

    decl %esi               # Нет, уменьшаем %esi на 1
    jmp ToStr_begin         # и переходим в начало циклa

some_changes:
 incl count_num
 movl %ecx, str_len # Счетчик для длины строки вывода   

ToStr_out:
    cmpl count_num, %esi  # В %esi макс. кол-во цифр с.с.? (5 в 10 сс)
    je stop_to_string     # Да, выходим

    movb out10(%esi), %al   # Копируем байт по адресу  out(%esi) в %al
    movb $0, out10(%esi)    # Записываем 0 по адресу out(%esi)
    movb %al, out10(%edi)   # Записываем значение %al по адресу out(%edi)
    inc %esi                # Увеличиваем %esi на 1
    inc %edi                # Увеличиваем %edi на 1
    jmp ToStr_out       # Переходим в начало цикла                  


stop_to_string:   # Вывод суммы
 movl $4, %eax      # номер сист. вызова write
 movl $1, %ebx      # параметр 1: дескриптор стандартного вывода    
 movl $out10, %ecx  # параметр 2: адрес памяти с выводимыми символами
 movl str_len, %edx        # параметр 3: количество байтов для вывода
 int $0x80      # выполнить системный вызов
 Puts ""
 movw $'',out10          # обнуляем буфер вывода

cmpw $10, num_system    # Если 10 сс была, то идем к 8 сс
je print_summ_numbers_8

cmpw $8, num_system     # Если 8 сс была, то идем к 2 сс
je print_summ_numbers_2

jmp input # К вводу следующего числа

.end

Ответы (0 шт):