Почему Ассемблер вместо суммы выводит рандомное большое число?
подскажите, пожалуйста, как сделать так, чтобы Ассемблер считал правильно. При вводе двух чисел программа должна выдавать их сумму, а на выходе получается вообще другое число.
.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