Поделитесь своими знаниями, ответьте на вопрос:
Нужна с Асемблером! Нужно написать на ассемблере задачки. Номер 1 В программу вводиться 2 натуральных числа: A и B. Если A делится на B, то вывести частное, иначе вывести оба числа. Номер 2 В программу вводиться натуральное число. Нужно программе подсчитать содержащееся в нём количество простых множителей, равных 5-ти. Номер 3 В программу вводиться X натуральных чисел. Нужно программе посчитать, сколько среди введённых чисел чётных и нечётных. Номер 4 В программу вводиться натуральное число X . Подсчитать X !. Если X! не вмещается в ячейку памяти (переполнение), вывести -1. Номер 5 Вычислить приближённое значение натурального числа е по формуле: r = 1 + 1/2! + 1/1! +1/3! + 1/4!; Номер 6 В программу вводиться 2 натуральных числа: A и B. Вычислить C = AB. Если C не вмещается в ячейку памяти (переполнение), вывести -1. Номер 7 В программу вводиться в произвольном порядке три положительных и три отрицательных числа. Вывести сначала отрицательные числа, а затем - положительные. Номер 8 В программу вводиться три числа и вывести их в порядке возрастания. Номер 9 Алгоритм Герона для вычисления квадратного корня x = a1/2. Ввести положительное число a. Принять в первом приближении x1 = a/2; Вычислять по формуле xi = (a/xi-1 + xi-1)/2 , пока |a - xi*xi| > 0.001*a. Номер 10 В программу вводиться натуральное число a. Определить, в какой из следующих диапазонов оно попадает: 1. 0 ≤ a ≤ 10 ; 2. 10 1000 . Вывести номер диапазона. Номер 11 В программу вводиться X чисел x1, x2, . xX, X > 3. Вывести xi, если xi > xi-1, i =2, 3, ..X. Номер 12 В программу вводиться X чисел. Найти их среднее арифметическое. Номер 13 В программу вводиться коды ASCII двух чисел. Вывести в арабских цифрах большее из них. Номер 14 В программу вводиться число записанное арабскими цифрами. Вывести его в кодах ASCII. Номер 15 В программу вводиться X чисел. Найти их произведение. Номер 16 В программу вводиться коды ASCII X символов. Выбрать из них и вывести только коды цифр. Номер 17 Вводить натуральные числа до тех пор, пока не выполнится условие: Xi ≥ Xi-1 + Xi-2. Номер 18 Вводятся коды символов в UTF-8. Нужно выводить только коды цифр. Номер 19 Вводить натуральные числа до тех пор, пока не будет введено такое число a, что a + a = a * a = a2. (1) P.s:(1) Должно проверяться в программе даже, если Вы догадались, что это за число. Номер 20 Вводить натуральные числа до тех пор, пока не будут введены три таких числа a, b и с, что a2+ b2 = c2. Выведите эти числа.
Ассемблер код для решения задачи номер 1 будет выглядеть следующим образом:
```
section .data
message db 'Введите число A: '
message_len equ $ - message
message2 db 'Введите число B: '
message2_len equ $ - message2
message3 db 'Частное равно: '
message3_len equ $ - message3
message4 db 'A не делится на B. A = '
message4_len equ $ - message4
message5 db ', B = '
message5_len equ $ - message5
section .text
global _start
_start:
; выводим сообщение "Введите число A: "
mov eax, 4
mov ebx, 1
mov ecx, message
mov edx, message_len
int 0x80
; считываем число A
mov eax, 3
mov ebx, 0
mov ecx, num_a
mov edx, 4
int 0x80
; выводим сообщение "Введите число B: "
mov eax, 4
mov ebx, 1
mov ecx, message2
mov edx, message2_len
int 0x80
; считываем число B
mov eax, 3
mov ebx, 0
mov ecx, num_b
mov edx, 4
int 0x80
; сравниваем числа A и B
mov eax, dword [num_a]
mov ebx, dword [num_b]
cmp eax, ebx
; если A делится на B, выводим частное
je print_quotient
; если A не делится на B, выводим оба числа
jmp print_numbers
print_quotient:
; выводим сообщение "Частное равно: "
mov eax, 4
mov ebx, 1
mov ecx, message3
mov edx, message3_len
int 0x80
; делим числа A и B
xor edx, edx ; обнуляем регистр edx
mov eax, dword [num_a]
div dword [num_b]
; преобразуем частное в строку
push eax
mov eax, 0
mov ecx, 10
xor edx, edx
convert_loop:
xor edx, edx
div ecx
add dl, '0'
push dx
inc eax
cmp eax, 0
jnz convert_loop
; выводим частное
print_loop:
pop eax
or al, 0x30
mov [result_buffer], al
mov eax, 4
mov ebx, 1
mov ecx, result_buffer
mov edx, 1
int 0x80
dec edx
cmp edx, 0
jge print_loop
; переходим к выводу обоих чисел
jmp print_numbers
print_numbers:
; выводим число A
mov eax, dword [num_a]
push eax
mov eax, 0
mov ecx, 10
xor edx, edx
convert_loop2:
xor edx, edx
div ecx
add dl, '0'
push dx
inc eax
cmp eax, 0
jnz convert_loop2
; выводим сообщение "A не делится на B. A = "
mov eax, 4
mov ebx, 1
mov ecx, message4
mov edx, message4_len
int 0x80
; выводим число A
print_loop2:
pop eax
or al, 0x30
mov [result_buffer], al
mov eax, 4
mov ebx, 1
mov ecx, result_buffer
mov edx, 1
int 0x80
dec edx
cmp edx, 0
jge print_loop2
; выводим сообщение ", B = "
mov eax, 4
mov ebx, 1
mov ecx, message5
mov edx, message5_len
int 0x80
; выводим число B
mov eax, dword [num_b]
push eax
mov eax, 0
mov ecx, 10
xor edx, edx
convert_loop3:
xor edx, edx
div ecx
add dl, '0'
push dx
inc eax
cmp eax, 0
jnz convert_loop3
print_loop3:
pop eax
or al, 0x30
mov [result_buffer], al
mov eax, 4
mov ebx, 1
mov ecx, result_buffer
mov edx, 1
int 0x80
dec edx
cmp edx, 0
jge print_loop3
; завершаем программу
mov eax, 1
xor ebx, ebx
int 0x80
section .bss
num_a resd 1
num_b resd 1
result_buffer resb 1
```
Программа запрашивает у пользователя два числа A и B, считывает их и затем проверяет, делится ли A на B. Если да, то выводит частное чисел A и B. Если нет, то выводит оба числа.
Номер 2:
Ассемблер код для решения задачи номер 2 будет выглядеть следующим образом:
```
section .data
message db 'Введите число: '
message_len equ $ - message
result_message db 'Количество простых множителей, равных 5-ти: '
result_message_len equ $ - result_message
section .text
global _start
_start:
; выводим сообщение "Введите число: "
mov eax, 4
mov ebx, 1
mov ecx, message
mov edx, message_len
int 0x80
; считываем число
mov eax, 3
mov ebx, 0
mov ecx, num
mov edx, 4
int 0x80
; сохраняем вводимое число в регистры eax и ecx
mov eax, dword [num]
mov ecx, eax
; обнуляем счетчик простых множителей
xor ebx, ebx
; инициализируем счетчик делителей
mov edx, 2
; цикл проверки делителей
check_divisor:
xor edx, edx ; обнуляем регистр edx
div edx ; делим число на делитель
; проверяем, является ли делитель 5-м простым множителем
cmp edx, 5
je increment_counter
; увеличиваем делитель для проверки
inc edx
cmp edx, ecx ; проверяем, не превысили ли мы число
jle check_divisor
print_result:
; выводим сообщение "Количество простых множителей, равных 5-ти: "
mov eax, 4
mov ebx, 1
mov ecx, result_message
mov edx, result_message_len
int 0x80
; преобразуем счетчик в строку
push ebx
mov ebx, 0
mov edx, 10
xor eax, eax ; обнуляем регистр eax
convert_loop:
xor edx, edx
div edx
add dl, '0'
push dx
inc ebx
cmp eax, 0
jnz convert_loop
; выводим количество простых множителей
print_loop:
pop eax
or al, 0x30
mov [result_buffer], al
mov eax, 4
mov ebx, 1
mov ecx, result_buffer
mov edx, 1
int 0x80
dec edx
cmp edx, 0
jge print_loop
; завершаем программу
mov eax, 1
xor ebx, ebx
int 0x80
section .bss
num resd 1
result_buffer resb 1
```
Программа запрашивает у пользователя натуральное число, считывает его и затем подсчитывает количество простых множителей, равных 5-ти.
Номер 3:
Ассемблер код для решения задачи номер 3 будет выглядеть следующим образом:
```
section .data
message db 'Введите число: '
message_len equ $ - message
even_message db 'Четных чисел: '
even_message_len equ $ - even_message
odd_message db 'Нечетных чисел: '
odd_message_len equ $ - odd_message
section .text
global _start
_start:
; выводим сообщение "Введите число: "
mov eax, 4
mov ebx, 1
mov ecx, message
mov edx, message_len
int 0x80
; считываем число
mov eax, 3
mov ebx, 0
mov ecx, num
mov edx, 4
int 0x80
; сохраняем вводимое число в регистр eax
mov eax, dword [num]
; обнуляем счетчики четных и нечетных чисел
xor ebx, ebx
xor ecx, ecx
; цикл подсчета четных и нечетных чисел
count_numbers:
test al, 1 ; проверяем младший бит числа
; если младший бит равен 0, число четное
jz increment_even_counter
; если младший бит равен 1, число нечетное
inc ecx
increment_even_counter:
; увеличиваем счетчик четных чисел
inc ebx
; сдвигаем число на один бит вправо
shr eax, 1
; проверяем, что все биты числа были обработаны
cmp eax, 0
jnz count_numbers
print_results:
; выводим сообщение "Четных чисел: "
mov eax, 4
mov ebx, 1
mov ecx, even_message
mov edx, even_message_len
int 0x80
; преобразуем счетчик четных чисел в строку
push ebx
mov ebx, 0
mov edx, 10
xor eax, eax ; обнуляем регистр eax
convert_loop1:
xor edx, edx
div edx
add dl, '0'
push dx
inc ebx
cmp eax, 0
jnz convert_loop1
; выводим количество четных чисел
print_loop1:
pop eax
or al, 0x30
mov [result_buffer], al
mov eax, 4
mov ebx, 1
mov ecx, result_buffer
mov edx, 1
int 0x80
dec edx
cmp edx, 0
jge print_loop1
; выводим сообщение "Нечетных чисел: "
mov eax, 4
mov ebx, 1
mov ecx, odd_message
mov edx, odd_message_len
int 0x80
; преобразуем счетчик нечетных чисел в строку
push ebx