0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32

Массив с отрицательными числами (Atmega 128, ASM)

18.11.2014, 12:35. Показов 2111. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Снова обращаюсь за помощью, не могу понять как реализовать данное задание
Дан массив чисел N, обнулить ячейки с отрицательными числами и записать в них номера этих ячеек и посчитать кол-во преобразований. Я только поняла как задать массив, и что скорее всего тут должно быть много циклов на проверку, но все рано не могу разобраться, посмотрела много тем, но похожей не одной, помогите пожалуйста.

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2014, 12:35
Ответы с готовыми решениями:

Запись результатов АЦП в массив (Atmega 128)
Здравствуйте! В моей задаче необходимо считать результаты измерения АЦП гармонического сигнала, частота которого должна входить в диапазон...

ASM atmega написать программу на ASM
Нужна помощь в написании программы с объяснениями.. Проверить свою программу Вашу работу. Подпрограмма для ATmega1284 на Асм,...

Массив с отрицательными числами
Всем привет. Помогите пожалуйста с кодом. int end = 50; int mas2 = new int; int sum2 = 0; ...

11
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
18.11.2014, 14:52
Цитата Сообщение от Dashta Посмотреть сообщение
обнулить ячейки с отрицательными числами
а числа то какие?
Допустим 8 битные
Копируем число из массивчика допустим в r16. Вспоминаем что сказал препод
Цитата Сообщение от Dashta Посмотреть сообщение
но препод сказал что я не права и первый бит в прямом коде это знак
смотрим систему команд, видим наличие команд SBRC или SBRS ...
продолжать?
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32
18.11.2014, 19:29  [ТС]
Блин) Вот это я затупила) Спасибо большое) все стало на свои места)) Сейчас пробовать буду

Добавлено через 4 часа 32 минуты
Целый день над этим сижу, мозг уже не соображает, делала по примеру из методички

Пример:Дан массив N однобайтных чисел в прямых кодах (положительных и
отрицательных) с адреса $0101. Подсчитать количество единиц в дополнительных
кодах отрицательных чисел этого массива. Ответ поместить в ячейку $0100.
Ниже приведен пример программы для N=10.
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
.device ATmegal28
.include "ml28def.inc"
ldi XL, $00 ; Адрес ответа $0100 в индексный регистр X
ldi XH, $01
ldi R17, 10
ldi R18, $08
ldi R20, $81
ldi R19, 0
ldi ZH, High(kod*2)
ldi ZL, Low(kod*2)
M4: 
lpm
mov R16, RO;
adiw ZL, 1
tst R16
brpl M5
com R16
add R16, R20
clc
M3:
rol R16
brcs M2
dec R18
breq M5
rjmp M3
M2:
inc R19
clc
dec R18
brne M3
ldi R18, 8
M5: decR17
brne M4
stX, R19
M6: rjmp M6
kod: .db "FF, FE, FD, FC, FB,FA,7B,7A,79,78"

А вот моя программка, но я так запуталась что не могу выкарабкаться, понимаю что где то в начале ошибка, помогите пожалуйста, где не так?
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
.device ATmega128
.include "m128def.inc"
ldi XL, $00 ;Адрес ответа $0100 в индексный регистр X
ldi XH, $01 
ldi R17,10 ;R17:=10, "10" -длина массива
ldi R18,$08;Число бит в байте R18:=8
ldi R19, 0 ;Счетчик
ldi ZH, high(kod*2) ;Загрузка старшего байта адреса первого элемента массива
ldi ZL, low(kod*2) ;Загрузка младшего байта адреса первого элемента массива
 
M4:
lpm ;Загрузка в R0 элемента массива по адресу в индексном регистре Z
mov R16,R0
adiw ZL,1 ;Перейти на следующий адрес в индексном регистре Z
tst R16 ;Проверить знак числа
brpl M5 ;Переход по плюсу на метку М5
eor R16,R16 ; Обнуление ячейки R16
inc R19 ; В счетчик единиц добавить единицу
clc ;Сбросить триггер переноса
M5:
dec R17 ;Уменьшить счетчик числа чисел массива
brne M4 ;Переход, по не равно, на М4
st X,R19 ;Записать ответ в ячейку по адресу в индексном регистре X
M6: rjmp M6
kod:.db "81, 80, 40, 36, 81, 52, 80, 81, 63, 80"
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
18.11.2014, 21:52
0. В X адрес массива
1. Косвенная загрузка с пост-инкрементом
2. Пропустить если бит в регистре установлен (проверяем отрицательное ли число)
3. JMP к 1.
4. X = X - 1 возвращаем указатель к предыдущему адресу
5. увеличиваем счетчик отриц. чисел
6. записываем счетчик ST X+, счетчик
7. Проверяем не кончился массив
8. если не кончился jmp к 1.
Массив в озу.
Извините на асме некогда писать, к тому же Вы умная девушка должны сами.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32
20.11.2014, 14:55  [ТС]
Извините, туплю, не получается у меня... Берет не те числа которые в массиве, или я не понимаю как это должно срабатывать, и еще я не знаю как в ячейке массива обнулить и записать туда номер ячейки, как с регистром сделать понимаю а с ячейкой нет(
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.11.2014, 15:30
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.def    count   =r16
.def    tmp     =r17
.def    c_end   =r18
    
    ldi  c_end,20
    clr  count
    clr  r27        ;Очистить старший байт X
    ldi  r26, $20   ;Установить $20 в младший байт X
m1:
    ld   r0, X+     ;Загрузить в r0 содерж. SRAM по адресу$20
    sbrc r0, 7  ;Пропустить если бит 7 в r0 установлен
    rjmp m1     ; если число не отриц. переход к m1
    dec  r26
    inc  count
    st   X+,count   ; в ячейку где было отрицательное число записываем номер
    subi c_end,0
    brne m1
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32
20.11.2014, 15:53  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
.def* * count * =r16
.def* * tmp * * =r17
.def* * c_end * =r18
ldi *c_end,20
* * clr *count
А что тут происходит? И как мне массив записать? Это получается вся программа или кусочек?
Цитата Сообщение от Витальич Посмотреть сообщение
ldi *r26, $20
Что за число? Я себе представляю просто внизу в эмуляторе должен появится массив и я его проверяю, а там этого массива нет, или я не правильно думаю. Прошу прощения что такая непонятливая и приставучая, просто от препода никакого толку, вот задание, методичка в которой только задание и все, и на вопросы не отвечает
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.11.2014, 16:05
.def count =r16 - регистру r16 присваиваю имя count
.def tmp =r17 - тоже
.def c_end =r18 - тоже

ldi c_end,20 - в регистр r18 заношу число 20
clr count - очищаю регистр r16
Цитата Сообщение от Dashta Посмотреть сообщение
Это получается вся программа или кусочек?
кусочек
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32
21.11.2014, 11:23  [ТС]
Отлично, он все считает, оказывается при задании массива нужно ставить $ перед каждым числом и в методичке просто опечатка, замечательно, остался только один вопрос какие команды и куда мне надо впихнуть чтобы ячейки массива обнулялись и записывали туда адрес ячейки которая обнулилась основываясь на моей программе
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.device ATmega128
.include "m128def.inc"
ldi XL, $00 ;Адрес ответа $0100 в индексный регистр X
ldi XH, $01 
ldi R17,10 ;R17:=10, "10" -длина массива
ldi R18,$08;Число бит в байте R18:=8
ldi R19, 0 ;Счетчик
ldi ZH, high(kod*2) ;Загрузка старшего байта адреса первого элемента массива
ldi ZL, low(kod*2) ;Загрузка младшего байта адреса первого элемента массива
M4:
lpm ;Загрузка в R0 элемента массива по адресу в индексном регистре Z
mov R16,R0
adiw ZL,1 ;Перейти на следующий адрес в индексном регистре Z
tst R16 ;Проверить знак числа
brpl M5 ;Переход по плюсу на метку М5
inc R19 ; В счетчик единиц добавить единицу
mov
clc ;Сбросить триггер переноса
M5:
dec R17 ;Уменьшить счетчик числа чисел массива
brne M4 ;Переход, по не равно, на М4
M6: rjmp M6
kod:.db $FB, $33, $FE, $36, $52, $D1, $80, $C4, $63, $25
Добавлено через 16 часов 17 минут
лаба побеждена и сдана, спасибо за помощь!!
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
.device ATmega128
.include "m128def.inc"
ldi XL, $00 ;Адрес ответа $0100 в индексный регистр X
ldi XH, $01 
ldi R17,10 ;R17:=10, "10" -длина массива
ldi R18,$08;Число бит в байте R18:=8
ldi R19, 0 ;Счетчик
ldi R21,0
ldi ZH,$00;high(kod*2);Загрузка старшего байта адреса первого элемента массива
ldi ZL,$2A;low(kod*2) ;Загрузка младшего байта адреса первого элемента массива
 
 
M4:
lpm ;Загрузка в R0 элемента массива по адресу в индексном регистре Z
mov R16,R0
;adiw ZL,1 ;Перейти на следующий адрес в индексном регистре Z
tst R16 ;Проверить знак числа
brpl M5 ;Переход по плюсу на метку М5
inc R19 ; В счетчик единиц добавить единицу
st X,R21 ;обнуление ячейки (смотреть в data)
st X+,R30 ;запись номера ячейки 
clc ;Сбросить триггер переноса
M5:
adiw ZL,1 ;Перейти на следующий адрес в индексном регистре Z
dec R17 ;Уменьшить счетчик числа чисел массива
brne M4 ;Переход, по не равно, на М4
st X, R19
M6: rjmp M6
kod:.db $FB, $33, $FE, $36, $52, $D1, $80, $C4, $63, $25
0
Модератор
Эксперт по электронике
8976 / 6742 / 921
Регистрация: 14.02.2011
Сообщений: 23,844
21.11.2014, 22:41
Dashta,
может и не в тему, но я тут подумал как из прямого кода перевести в дополнительный
для перевода из прямого положительного в дополнительный отрицательный нужно инвертировать число и добавить 1
но в прямом отрицательном старший бит уже выставлен, значит инвертировать нужно только 7 бит
C
1
a=a^0x7F+1;
Assembler
1
2
3
LDI R2,7Fh;
EOR R1,R2; 
INC R1;
может где то пригодится
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 32
21.11.2014, 22:47  [ТС]
ValeryS, благодарю, следующая лаба как раз с дополнительным и прямым кодом и наверняка я попрошу помощи так как сложно бороться с человеком который сам не понимает и его давить только знаниями приходится, но пока пусть мои глазки отдохнут от ассемблера (не представляю как целый день можно сидеть и так напрягать глаза, они под вечер просто выпадают, бедные программисты) спасибо за помощь)
0
21.11.2014, 23:37

Не по теме:

Цитата Сообщение от Dashta Посмотреть сообщение
пусть мои глазки отдохнут от ассемблера
Цитата Сообщение от Dashta Посмотреть сообщение
бедные программисты)
тут вы ошиблись одновременно в нескольких аспектах :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2014, 23:37
Помогаю со студенческими работами здесь

Чтение в массив файла с отрицательными и дробными числами
Вопрос следующего характера: имеется файл вида: 0 -0.500000000000059 0.001 -0.48813963760693 0.002 -0.452031976744437 ...

Как заполнить массив и отрицательными и положительными числами
это только положительными, а как чтобы и отрицательными и положительными??? Заранее благодарю. Matr:=Random(99);

Массив: Заполнить массив значениями от 0 до 255, если значение меньше 128, заменить на 0, больше 128 - на 1...
Задача: Заполнить двумерный массив значениями от 0 до 255. Если значение меньше 128, заменить на 0, больше 128 - на 1. Вот написал код,...

программирование Atmega 128
Подскажите пожалуйста как подсоединять мегу к программатору avr910/ а то она чет не щьется.

Таймер Atmega 128
Здравствуйте, объясните пожалуйста вот эти строчки поэтапно clr r18 sbi DDRA,1 ldi r16,(1<<ISC61|1<<ISC60) out...


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

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

Новые блоги и статьи
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru