Попалась мне тут интересная задачка на асме.
Звучит примерно так:
На стандартный поток ввода подается последовательность 32-битных знаковых целых чисел. Последовательность завершается признаком конца файла. На стандартный вывод напечатайте сумму всех чисел в последовательности. Если при прибавлении очередного считанного числа к промежуточному значению получается результат, не представимый 32-битным знаковым типом, напечатайте либо максимальное представимое значение (при сложении положительных чисел), либо максимальное представимое отрицательное значение (при сложении отрицательных чисел) и завершите программу. Вывод числа завершайте переходом на новую строку. В программе допускается не более двух инструкций условного и безусловного перехода Программа будет компоноваться с
libc
. Точка входа в программу -main
. Можете использовать следующие вспомогательные функции:
readi32
- считать целое 32-битное знаковое числоwritei32
- напечатать целое 32-битное знаковое числоnl
- перевод кареткиfinish
- завершение программы
Для желающих, сразу же привожу решение:
main:
loop:
call readi32
jc end
add ebx, eax
jo overflow
jmp loop
overflow:
mov eax, ebx
mov ebx, 0x80000000
shr eax, 31
sub ebx, eax
end:
mov eax, ebx
call write32i
call nl
call finish