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

Аватара пользователя
Gooch

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

Сообщение Gooch »

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



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



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

Re: Assm - Помогите разобраться с задачей.

Сообщение lxa85 »

Gooch, задание понятно, всплывает с периодичностью в год. По расписанию лабораторных занятий.


Цитата Gooch:



Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение.
Assm - Помогите разобраться с задачей.




точно так.


Цитата Gooch:



Если по моим представлениям делать задачу то получается большой код.
Assm - Помогите разобраться с задачей.




Вовсе нет.


Цитата Gooch:



Так же вызывает затруднение вывод на экран двоичного значения регистра.
Assm - Помогите разобраться с задачей.




в чем именно трудность?



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

Re: Assm - Помогите разобраться с задачей.

Сообщение lxa85 »

Цитата lxa85:



в чем именно трудность?
Assm - Помогите разобраться с задачей.




я не нашел в описании printf на с++ как сделать вывод в двоичной форме Изображение




Цитата lxa85:



Вообще желательно бы видеть рассуждения "вслух".
Assm - Помогите разобраться с задачей.




вводим переменную Х, так как ввод с клавиатуры будет в десятичной форме, то сделал следующее:





Код:

Код: Выделить всё

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 делать сдвиг вправо.
Аватара пользователя
lxa85

Re: Assm - Помогите разобраться с задачей.

Сообщение lxa85 »

Цитата Gooch:



я не нашел в описании printf
Assm - Помогите разобраться с задачей.




не printf'ом единым жив программист. В задании четко обозначены циклы - используй их. Циклический сдвиг и все такое.

----

А вот приведенный код не понятен.

Занесли мы единицу в старший бит, и что? Кстати ввод единицы сделан не правильно. ЕМНИП в данном случае будет воспринята 10чная система. Чтобы указать, что 80 - это 16ричная система счисления, необходима дополнительная конструкция. 0x80, но все равно проверь в справочнике.

Ну, занесли 1цу, потом передали регистр в rez, без модификаций. И ничего у нас не поменялось.

----

Да, конечно, дополнительная переменная, определяющая позицию просто необходима.

----

И надо будет тебе подумать, как разбить регистр на две неравные части. Т.е. подумать с логической разбивкой, экранированием и т.п.
Аватара пользователя
Gooch

Re: Assm - Помогите разобраться с задачей.

Сообщение Gooch »

Цитата lxa85:



И надо будет тебе подумать, как разбить регистр на две неравные части.
Assm - Помогите разобраться с задачей.




для чего?




Цитата lxa85:



Ну, занесли 1цу, потом передали регистр в rez, без модификаций.
Assm - Помогите разобраться с задачей.




какие модификации имеется ввиду?




Цитата lxa85:



И ничего у нас не поменялось.
Assm - Помогите разобраться с задачей.




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



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

Re: Assm - Помогите разобраться с задачей.

Сообщение Gooch »

Цитата Gooch:



для чего?
Assm - Помогите разобраться с задачей.




А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?


Цитата Gooch:



какие модификации имеется ввиду?
Assm - Помогите разобраться с задачей.




Ну ты передал в регистр единицу, а потом сразу регистр отправил в память в переменную rez. Я это имел ввиду.


Цитата Gooch:



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




На "кофейной гуще" сложно сказать. Изображение Какая среда разработки? Может неправильно спрашиваешь? Может binary формат поставить?
Аватара пользователя
lxa85

Re: Assm - Помогите разобраться с задачей.

Сообщение lxa85 »

Цитата lxa85:



На "кофейной гуще" сложно сказать. Какая среда разработки?
Assm - Помогите разобраться с задачей.




Visual Studio 2010 C++



Код:

Код: Выделить всё

 printf("Введите значение бита (0 или 1): \n");
     scanf_s("%d",&x);
  printf("Ответ = %h\n",assembler(x));


Цитата lxa85:



А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
Assm - Помогите разобраться с задачей.




вот если честно то пока понятия не имею...



И где может быть ошибка?
Аватара пользователя
Gooch

Re: Assm - Помогите разобраться с задачей.

Сообщение Gooch »

Код:

Код: Выделить всё

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 Изображение

если переходы убрать, то код выполняется верно Изображение
Аватара пользователя
Gooch

Re: Assm - Помогите разобраться с задачей.

Сообщение Gooch »

Код:

Код: Выделить всё

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 Изображение

если переходы убрать, то код выполняется верно Изображение
Аватара пользователя
lxa85

Re: Assm - Помогите разобраться с задачей.

Сообщение lxa85 »

Цитата Gooch:



JNE bit



JNE - Jump Not Equal Переход в случае НЕравенства.

Когда вводится число отличное от единицы (а не нуля), будет осуществлен переход. (cmp cl, 1)

Дальнейшая ассемблерная вставка мне не ясна, поэтому оставляю ее на твое усмотрение.
Ответить

Вернуться в «Программирование и базы данных»