Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 00:16   #1
Natali2003
Новичок
Джуниор
 
Регистрация: 28.01.2009
Сообщений: 2
По умолчанию Assembler для ARM

Очень нужна помощь!
Нужно составить программку, которая посчитает сумму двух модулей чисел (числа 32-ух битные и целые). Числа даются в регистрах R0 и R1. Результат записывается в регистре R0.

Я не понимаю принципа проверки числа. Если оно положительное, то нужно просто посчитать сумму, а если оно отрицательное, то сначала его нужно переделать в положетельное, а затем посчитать сумму.
Кажется как-то с командой "CMP"?
Пожалуйста, подскажите решение. Заранее благодарю.
Natali2003 вне форума Ответить с цитированием
Старый 28.01.2009, 07:33   #2
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию

Знаковые числа представляются дополнением.
Положи число в 32-битный регистр, тогда в его младшей половине будет то, что отвечает за целую часть. отними ЭТО от HEX "FFFF" - получишь модуль.

PS. Будет забавно если я прав, но попробовать можно

Последний раз редактировалось ("")(Э_Є)(""); 28.01.2009 в 07:59.
("")(Э_Є)("") вне форума Ответить с цитированием
Старый 28.01.2009, 14:24   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от ("")(Э_Є)("") Посмотреть сообщение
Положи число в 32-битный регистр, тогда в его младшей половине будет то, что отвечает за целую часть
???
Цитата:
Сообщение от ("")(Э_Є)("") Посмотреть сообщение
отними ЭТО от HEX "FFFF" - получишь модуль.
Модуль нуля, получается, равен FFFFh?.. О_о
Код:
teq       r0,#0
rsbmi     r0,r0,#0 
teq       r1,#0
rsbmi     r1,r1,#0 
add       r0,r0,r1
После teq при отрицательном результате установлен флаг N - в таком случае надо вычесть число из нуля.

Последний раз редактировалось Somebody; 28.01.2009 в 14:41.
Somebody вне форума Ответить с цитированием
Старый 28.01.2009, 15:28   #4
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию

Somebody
Я отрицаю вашу реальность и создаю свою собственную (с)
Меня накрыло, видимо, тяжелый случай прозрения
("")(Э_Є)("") вне форума Ответить с цитированием
Старый 28.01.2009, 17:02   #5
Natali2003
Новичок
Джуниор
 
Регистрация: 28.01.2009
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
???

Модуль нуля, получается, равен FFFFh?.. О_о
Код:
teq       r0,#0
rsbmi     r0,r0,#0 
teq       r1,#0
rsbmi     r1,r1,#0 
add       r0,r0,r1
После teq при отрицательном результате установлен флаг N - в таком случае надо вычесть число из нуля.

Спасибо за ответ, я не сомневаюсь, что это работает, только вот "teq" и "rsbmi" мне совсем не знакомы.
Мы делали программки такого плана:

Код:
begin
  mov r2, #1

repeat
  cmp r1, #0
  beq end
  mul r2, r2, r0
  sub r1, r1, #1
  b repeat

end
  mov r0, r2
  bx lr
Нельзя ли подсказать что-то в таком роде? )

Последний раз редактировалось rpy3uH; 29.01.2009 в 14:35.
Natali2003 вне форума Ответить с цитированием
Старый 29.01.2009, 14:25   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

teq r0,#0 можно заменить на cmp r0,#0
teq выполняет логическое или, cmp - вычитание. Здесь всё равно, так как надо только узнать знак операнда.
sub вычитает из первого операнда второй, rsb вычитает из второго первый, т.е. из нуля вычитается значение регистра и записывается обратно в этот регистр. mi - код условия: инструкция выполняется если стоит флаг "отрицательный результат" (как eq в инструкции b - выполянется, если установлен флаг "ноль"). Если используется cmp, то вместо условия mi можно использовать lt (меньше), между "меньше нуля" и "отрицательный результат" никакой разницы.
Таким образом, можно заменить teq на cmp, а от остальное, по-моему, только усложнит программу. Про выход из подпрограммы не знаю, я для arm не писал.
Somebody вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программы для Студента (Assembler) Andatra Помощь студентам 2 06.08.2019 08:07
создать драйвер дос для клавы assembler assemb Помощь студентам 2 02.11.2008 19:35
Возможно ли написать на языке Assembler модуль расширения для BIOS biff Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 07.07.2008 13:41
Ассемблер для ARM Pavlik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.04.2008 15:30
Является ли Assembler для вас "лесом дремучим"? Delpher Свободное общение 9 14.12.2007 11:32