Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 1
Регистрация: 06.09.2019
Сообщений: 27
1
MASM

В каждом числе массива определить количество разрядов, равных 1

17.03.2020, 16:48. Просмотров 1676. Ответов 10

В каждом числе массива определить количество разрядов, равных 1

Мальчики, помогите, как это реализовать на ассемблере?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2020, 16:48
Ответы с готовыми решениями:

В каждом числе массива определить количество разрядов, равных "1"
Вот задание В каждом числе массива определить количество разрядов, равных "1". Записать это...

В каждом числе массива определить количество разрядов, равных "1"
В каждом числе массива определить количество разрядов, равных "1". Записать это количество в...

В нечетных числах массива найти количество разрядов, равных нулю и единице
Помогите с решением, не оставляйте без внимания) Задание: в одномерном массиве чисел целого типа...

Проверить как изменится количество разрядов в числе M по сравнению с количеством разрядов числа N
Дано натуральное число N. Определить M=N! Проверить как измениться количевство разрядов в числе M...

10
Модератор
6367 / 3104 / 1253
Регистрация: 01.02.2015
Сообщений: 9,951
Записей в блоге: 1
17.03.2020, 17:00 2
Лучший ответ Сообщение было отмечено antonvladi как решение

Решение

antonvladi, я помню, что программы вы умеете создавать.
Непосредственно подсчёт единичных разрядов - это алгоритмическая задача или задача на знание одной инструкции popcnt.

https://habr.com/ru/post/276957/
Подсчитать количество единичных битов в массиве чисел (для Х86)
1
1 / 1 / 1
Регистрация: 06.09.2019
Сообщений: 27
27.03.2020, 08:29  [ТС] 3
Я сделала так, но он все равно биты не считает
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
.386P
PUBLIC 99
MODEL FLAT, C
_TEXT SEGMENT
LAB3 PROC
PUSH EBP
MOV EBP, ESP
MOV ESI, DWORD PTR [EBP+8]
MOV ECX, DWORD PTR [EBP+12]
mov CX,10
xor bx,bx
c1:
 mov ax,[esi] 
 push CX
 mov CX,16
c2:
 
 and ax, 000000000000001b
 cmp ax,1 
 jne c3 
 inc bx ;подсчет кол-во битов
 shr ax, 1
c3:
 loop c2
 pop CX 
 add esi, 2
 loop c1
 
MOV ESI, DWORD PTR [EBP+8]
MOV ECX, DWORD PTR [EBP+12]
MOV [EBP+16], bx
mov edx, [EBP+16]
 
POP EBP
RET
LAB3 ENDP
_TEXT ENDS
END
0
5467 / 2560 / 345
Регистрация: 17.02.2013
Сообщений: 3,671
27.03.2020, 09:50 4
Тут мешанина 16-и и 32-х разрядного. Какая целевая платформа все таки - Винды 32-разрядные или MS-DOS 16-и разрядная ? Они работают в разных режимах процессора с разной разрядностью.
2
Модератор
6367 / 3104 / 1253
Регистрация: 01.02.2015
Сообщений: 9,951
Записей в блоге: 1
27.03.2020, 12:44 5
Все предыдущие темы топикстартера были по программированию в masm32. Эта, судя по оформлению - создание процедуры на ассемблере, для вызова из программы на C.

antonvladi, напрасно вы проигнорировали образцы кода и теорию по подсчёту единичных разрядов.

У вас в коде ошибки:
1. нет внятного описания используемых аргументов подпрограммы - может вы неправильно определили смещение относительно EBP
2. в строке 9 заполняется ECX, и в строке 10 он затирается числом 10. Это логическая ошибка.
3. в 32-разрядном режиме невозможно поместить в стек или вытолкнуть из него 16-разрядный регистр, инструкция loop использует регистр ECX - это то, о чём говорит Ethereal.
4. для ассемблерных подпрограмм, вызываемых из C/C++ для Windows есть множество соглашений и ограничений. В частности по регистрам, которые должны остаться неизменными после завершения подпрограммы. Не помню всё, кажется менять можно только edx и eax. Т.е. вы ДОЛЖНЫ восстановить ESI, ECX и другие регистры.

Непосредственно подсчитывать количество 1 можно сдвигом (любым) и суммированием с учётом переноса (adc). Это самый простой способ, гораздо проще используемого вами.
1
1 / 1 / 1
Регистрация: 06.09.2019
Сообщений: 27
30.03.2020, 19:42  [ТС] 6
Спасибо, я разобралась!
У меня получилось
0
Модератор
6367 / 3104 / 1253
Регистрация: 01.02.2015
Сообщений: 9,951
Записей в блоге: 1
30.03.2020, 20:32 7
А похвастайтесь и кодом
0
1 / 1 / 1
Регистрация: 06.09.2019
Сообщений: 27
31.03.2020, 07:45  [ТС] 8
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.386P
PUBLIC LAB3
.MODEL FLAT, C
_TEXT SEGMENT
LAB3 PROC
PUSH EBP
MOV EBP, ESP
MOV ESI, DWORD PTR [EBP+8]
MOV ECX, DWORD PTR [EBP+12]
MOV EDI, DWORD PTR [EBP+16]
mov CX,5
xor bx,bx
 
c1: 
 mov ax,[esi] 
 push CX
 mov CX,15
c2:
 mov dx, ax
 and dx, 000000000000001b
 cmp dx,1 
 jne c3 
 inc bx 
c3:
 shr ax, 1
 loop c2
 MOV [edi], bx
 add edi, 2
 add esi, 2
 pop CX 
 loop c1
 
POP EBP
RET
LAB3 ENDP
_TEXT ENDS
END
1
Модератор
6367 / 3104 / 1253
Регистрация: 01.02.2015
Сообщений: 9,951
Записей в блоге: 1
31.03.2020, 09:05 9
Молодец!

Я бы сделал чуть иначе.
1. на входе в процедуру сохранил а на выходе восстановил бы все используемые регистры - ESI, EDI, ECX, EBX - это требование соглашения о вызове
2. Вы ошибаетесь при использовании цикла loop - нужно использовать регистр ECX. То, что процедура работает - случайность, вызванная малыми размерами входного массива.
3. вычисление количества установленных в 1 разрядов прямым подсчётом делал бы
Assembler
1
2
3
4
5
6
mov ecx, 16
xor ebx, ebx
@@:
  shl ax, 1
  adc ebx, 0
loop @b
Т.е. даже сейчас - программа содержит ошибки.

Добавлено через 2 минуты
И ещё. Суммирование единиц производится в EBX, но в EAX это значение не помещается и в вызывающий код ничего не передаётся.
1
1 / 1 / 1
Регистрация: 06.09.2019
Сообщений: 27
31.03.2020, 09:19  [ТС] 10
Спасибо большое, я исправлю сейчас)
0
Модератор
6367 / 3104 / 1253
Регистрация: 01.02.2015
Сообщений: 9,951
Записей в блоге: 1
31.03.2020, 09:20 11
Про "ничего не передаётся" - я ошибся - в строке 27 передаётся.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2020, 09:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Проверить, как изменилось количество разрядов в числе M по сравнению с количеством разрядов числа N
Выручайте....Дано натуральное число N. Определить M=N!. Проверить, как изменилось количество...

Дано натуральное число N. Определить M=N!. Проверить, как изменилось количество разрядов в числе M
Дано натуральное число N. Определить M=N!. Проверить, как изменилось количество разрядов в числе M...

В каждом элементе массива А[10] подсчитать количество единичных битов среди разрядов с номерами от 3 до 6
В каждом элементе массива А подсчитать количество единичных битов среди разрядов с номерами от 3 до...

Определить количество цифр в каждом заданном числе
Составить программу для решения задачи своего варианта с использованием методов-процедур и функций...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.