Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с массивами, посчитать нулевые биты 
:(
    Опции темы
DrWeb
Дата 10.1.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 25.11.2007
Где: Украина, Донецк

Репутация: нет
Всего: 1



Задачка: дан массив байтов.Посчитать количество нулевых битов. Это как делать - с помощью команды bt?Или есть другие варианты?подскажите
PM MAIL WWW   Вверх
Akina
Дата 10.1.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Код
xor dx,dx
mov si, offset mass
mov cx, len(mass)
cld
loop1:
lodsb
push cx
mov cx,8
loop2:
rcr al
adc dx,0
loop loop2
pop cx
loop loop1
' в DX - количество единичных битов



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrWeb
Дата 10.1.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 25.11.2007
Где: Украина, Донецк

Репутация: нет
Всего: 1



Akina, спасибо
а вот задачка: X[i]=Y[i]+C*Z[i]/16 , все это массивы слов
Вот мой код,но он наверно тупой=)я готовлюсь к экзамену-подскажите что исправить плиз
Код

.model small
.stack 256

.data 
N=10
X dw 10 dup (?)
Y dw 1,3,7,6,5,4,3,2,1,1
Z dw 3,2,4,5,3,2,6,5,7,4
C dw 1
DC dw 16
mes db 'Результат: $'

.code
start:
 mov ax,@data
 mov ds,ax
 xor ax,ax
 mov cx,N
 mov si,0
 mov y,0
 
 mov ah,0 ;очистка экрана     
 mov al,2      
 int 10h 
 
 go:
  mov bx,Y[si+1]
  mov ax,Z[si+1]
  imul C
  idiv DC  
  add ax,bx
  mov X[si+1],ax  
  inc si
 loop go 
 
 mov ah,02h ;выводим резалт на экран
 mov dx,X[2]
 add dx,30h
 int 21h   

 mov ax,4c00h
 int 21h
end start

PM MAIL WWW   Вверх
airyashov
Дата 11.1.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



массивы нумеруются с 0
Код

  mov bx,Y[si+1]



--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
DrWeb
Дата 12.1.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 25.11.2007
Где: Украина, Донецк

Репутация: нет
Всего: 1



Я знаю,что с 0.У меня ж массив слов-вот я и записываю все время во втрой байт результат.Лучше подскажите как оптимизировать код  smile 
PM MAIL WWW   Вверх
Mikl_
Дата 12.1.2009, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



DrWeb, смысл умножать на 1 (C=1)? 
для деления на степени двойки используется сдвиг вправо
в ассемблере линейные массивы лучше обрабатывать с конца
Код

;X[i]=Y[i]+C*Z[i]/16 
mov bx,18; количество байтов в массиве X - 2
a1: mov ax,Z[bx]
       shr ax,4
       add ax,Y[bx]
       mov X[bx],ax
       sub bx,2
       jns a1

PM MAIL   Вверх
ksili
Дата 12.1.2009, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



DrWeb, так а вообще твой код работает как надо?

1) Результат у тебя массив - а выводишь на экран одну цифру
2) С такой нумерацией элементов массивов по-моему первые эл-ты вообще не обрабатываются, а в конце происходит выход за пределы массива.
3) X[2], Y[si+1] это кажись не обращение ко второму байту в слове массива, а обращение ко второму слову в массиве. Но здесь я не уверен


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Mikl_
Дата 12.1.2009, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



ksili, именно ко второму байту -- расположение числа в памяти перевернуто 12345678h --> db 78h, 56h, 34h, 12h 
PM MAIL   Вверх
ksili
Дата 12.1.2009, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Не, я просто предполагал, что раз тип массива - dw, и для индексации используется регистр размером в слово, то и смещение должно считаться по словам, а не по байтам.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Mikl_
Дата 12.1.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



DrWeb, я понимаю задача учебная, но ты хотя бы двузначные числа в массив Y и  Z поставил -- иначе при делении Z[i] на 16 получается 0 и тогда X[i]=Y[i] наверное, можно сразу выводить результат в текстовую строку для последующего вывода на экран 
PM MAIL   Вверх
DrWeb
Дата 12.1.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 25.11.2007
Где: Украина, Донецк

Репутация: нет
Всего: 1



Цитата

DrWeb, смысл умножать на 1 (C=1)? 

эт чтобы удобней было считать результат вручную=)

Цитата

DrWeb, так а вообще твой код работает как надо?

1) Результат у тебя массив - а выводишь на экран одну цифру


Да - результаты выводит правильные. Я их так вывожу:
Код

show: mov ah,2h
     mov dx,X[bx]
     add dx,30h
     int 21h
     mov dx,2ch                            
     int 21h                                
     mov dx,20h                            
     int 21h                                
     sub bx,2
     jns show


Вроде рабочий код получился:
Код

.model small
.stack 256

.data 
N=10
X dw 10 dup (?)
Y dw 15,8,7,3,1,8,12,15,7,9,12,15
Z dw 2,5,41,25,31,9,17,4,6,8,36,63
C dw 10

.code
start:
 mov ax,@data
 mov ds,ax
 xor ax,ax  
 mov bx,N
 
 mov ah,0 ;очистка экрана     
 mov al,2      
 int 10h 

 a1: mov ax,Z[bx]
     shr ax,4
     add ax,Y[bx]
     mov X[bx],ax
     sub bx,2
     jns a1
  
 mov bx,N 
 show: mov ah,2h
     mov dx,X[bx]
     add dx,30h
     int 21h
     mov dx,2ch                            
     int 21h                                
     mov dx,20h                            
     int 21h                                
     sub bx,2
     jns show

 mov ax,4c00h
 int 21h
end start

PM MAIL WWW   Вверх
Mikl_
Дата 12.1.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



DrWeb, не может у тебя правильно получится у тебя Y и Z содержат по 12 элементов
а в массив X ты выводишь всего 6
Код
mov bx,N;N=10
a1: mov ax,Z[bx]
     shr ax,4
     add ax,Y[bx]
     mov X[bx],ax
     sub bx,2
     jns a1
Для вывода на экран следовало использовать что-то вроде этого
Код
mov si,offset X
mov di,offset mes
cld
mov cx,12
a1: lodsw; mov ax,[si] si:=si+2
      aam; ax/10 частное в ah остаток в al
      or ax,3030h; превращаю в ASCII-код
      stosw; mov [di],ax выводишь на экран число от 00 до 99 di=di+2
      mov al,' '; разделитель между цифрами
      stosb
      loop a1


Это сообщение отредактировал(а) Mikl_ - 16.1.2009, 04:54
PM MAIL   Вверх
DrWeb
Дата 12.1.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 25.11.2007
Где: Украина, Донецк

Репутация: нет
Всего: 1



Mikl_, ну ж соответственно и выводил ток первые 6 элементов
Код

mov bx,N 
 show: mov ah,2h
           mov dx,X[bx]
           add dx,30h
           int 21h
           mov dx,2ch                            
           int 21h                                
           mov dx,20h                            
           int 21h                                
           sub bx,2
          jns show

и выводится правильные результат)
Это все равно думаю на экзамене прокатит, а так,Mikl_, спасибо за советы smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.