Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Assm - Помогите разобраться с задачей.

Ответить
Настройки темы
Assm - Помогите разобраться с задачей.

Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160


Конфигурация

Профиль | Отправить PM | Цитировать


Всем привет, тема задания битовые операции. Программы реализуются как ассемблерные вставки в языке высшего уровня (С++).

Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом вправо и потерей крайнего бита.

Может кто делал подобные? Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение. Если по моим представлениям делать задачу то получается большой код. Так же вызывает затруднение вывод на экран двоичного значения регистра.

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 21:55, 22-05-2011

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Gooch, задание понятно, всплывает с периодичностью в год. По расписанию лабораторных занятий.
Цитата Gooch:
Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение. »
точно так.
Цитата Gooch:
Если по моим представлениям делать задачу то получается большой код. »
Вовсе нет.
Цитата Gooch:
Так же вызывает затруднение вывод на экран двоичного значения регистра. »
в чем именно трудность?

Вообще желательно бы видеть рассуждения "вслух".

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 22:03, 22-05-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата lxa85:
в чем именно трудность? »
я не нашел в описании printf на с++ как сделать вывод в двоичной форме

Цитата lxa85:
Вообще желательно бы видеть рассуждения "вслух". »
вводим переменную Х, так как ввод с клавиатуры будет в десятичной форме, то сделал следующее:

Код: Выделить весь код
INT8 assembler(INT8 x)
{
 INT8 rez=0;
__asm
  {

 MOV cl,x  //проверка Х на значение не 0
 CMP cl,1
 JNE bit
		 
 prog:

 JMP end

 bit:
 MOV al,0
 ADD al,80 //так как у нас будет сдвиг вправо, то заносим в регистр al 10000000B
 MOV rez,al
 JMP prog

 end:
 }
     
return rez;
}
Далее я пробовал вывести значение переменной rez в HEX форме, но почему то выводит пустую ячейку и по-этому дальше пока ни чего не делал. Вообще думаю дальше сделать ввод переменной Y в котороя будет указывать на номер бита и в зависимости от значения Y делать сдвиг вправо.

-------
Не забываем жмакать "полезное сообщение"


Последний раз редактировалось Gooch, 23-05-2011 в 14:42.


Отправлено: 07:30, 23-05-2011 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Gooch:
я не нашел в описании printf »
не printf'ом единым жив программист. В задании четко обозначены циклы - используй их. Циклический сдвиг и все такое.
----
А вот приведенный код не понятен.
Занесли мы единицу в старший бит, и что? Кстати ввод единицы сделан не правильно. ЕМНИП в данном случае будет воспринята 10чная система. Чтобы указать, что 80 - это 16ричная система счисления, необходима дополнительная конструкция. 0x80, но все равно проверь в справочнике.
Ну, занесли 1цу, потом передали регистр в rez, без модификаций. И ничего у нас не поменялось.
----
Да, конечно, дополнительная переменная, определяющая позицию просто необходима.
----
И надо будет тебе подумать, как разбить регистр на две неравные части. Т.е. подумать с логической разбивкой, экранированием и т.п.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 08:19, 23-05-2011 | #4


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата lxa85:
И надо будет тебе подумать, как разбить регистр на две неравные части. »
для чего?

Цитата lxa85:
Ну, занесли 1цу, потом передали регистр в rez, без модификаций. »
какие модификации имеется ввиду?

Цитата lxa85:
И ничего у нас не поменялось. »
привиденный код не полный, это только значение переменной X, после метки prog будет дальше код программы.

И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой?

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 08:53, 23-05-2011 | #5


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Gooch:
для чего? »
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
Цитата Gooch:
какие модификации имеется ввиду? »
Ну ты передал в регистр единицу, а потом сразу регистр отправил в память в переменную rez. Я это имел ввиду.
Цитата Gooch:
И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой? »
На "кофейной гуще" сложно сказать. Какая среда разработки? Может неправильно спрашиваешь? Может binary формат поставить?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 09:39, 23-05-2011 | #6


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата lxa85:
На "кофейной гуще" сложно сказать. Какая среда разработки? »
Visual Studio 2010 C++
Код: Выделить весь код
 printf("Введите значение бита (0 или 1): \n");
     scanf_s("%d",&x);
  printf("Ответ = %h\n",assembler(x));
Цитата lxa85:
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо? »
вот если честно то пока понятия не имею...

И где может быть ошибка?

-------
Не забываем жмакать "полезное сообщение"


Последний раз редактировалось Gooch, 23-05-2011 в 18:52.


Отправлено: 12:29, 23-05-2011 | #7


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
INT8 assembler(INT8 z, INT8 x)
{
     INT8 rez=0;
     __asm
     {
         MOV cl,x //проверка Х на значение не 0
         CMP cl,1
         JNE bit
		 
prog:
		
		
JMP end

bit:
	MOV al,0
	MOV cl,80H
	ADD al,cl
	MOV rez,al
JMP prog

end:
     }
     
return rez;
}
Вообщем как вставить определенный бит в байт со сдвигом я придумал, но вот проблема, не могу понять, почему когда я делаю условные переходы у меня в результате выходит 0
если переходы убрать, то код выполняется верно

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 11:09, 24-05-2011 | #8


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Gooch:
JNE bit
JNE - Jump Not Equal Переход в случае НЕравенства.
Когда вводится число отличное от единицы (а не нуля), будет осуществлен переход. (cmp cl, 1)
Дальнейшая ассемблерная вставка мне не ясна, поэтому оставляю ее на твое усмотрение.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 19:26, 24-05-2011 | #9


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


ок...передел

Код: Выделить весь код
INT8 assembler(INT8 z, INT8 x)
{
     INT8 rez=0;
    
     __asm
     {
	MOV cl,x //проверка Х на значение не 0
	CMP cl,1
JNZ bit
	MOV cl,x
	CMP cl,0
JZ prog
bit:
	MOV al,0
	MOV cl,80H
	ADD al,cl
	MOV rez,al 
prog:
	 }      
     
return rez;
}
все равно не работает! Если я введу с клавиатуры ноль, то у меня все равно тупо выполняет дальше код, не делая перехода. По идеи же после ввода нуля он не должен выполнять дальнейшей код и rez должен остаться без значения? или я ошибаюсь?

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 19:44, 24-05-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Assm - Помогите разобраться с задачей.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - помогите с задачей! max1331003 Программирование и базы данных 0 24-12-2010 18:58
C/C++ - помогите с задачей по СИ!!! feliks2009 Программирование и базы данных 4 16-11-2009 00:18
Delphi - [решено] Помогите с задачей /Pascal/ Habetdin Программирование и базы данных 23 11-11-2009 22:46
C/C++ - [решено] Помогите с задачей! FeuerEngel Программирование и базы данных 3 28-05-2009 09:58
Delphi - [решено] Помогите с комбинаторной задачей! ALI Программирование и базы данных 16 01-01-2009 14:10




 
Переход