Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите разобраться с задачей. (http://forum.oszone.net/showthread.php?t=207361)

Gooch 22-05-2011 21:55 1680784

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

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

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

lxa85 22-05-2011 22:03 1680791

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

Цитата Gooch
Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение. »

точно так.
Цитата:

Цитата Gooch
Если по моим представлениям делать задачу то получается большой код. »

Вовсе нет.
Цитата:

Цитата Gooch
Так же вызывает затруднение вывод на экран двоичного значения регистра. »

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

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

Gooch 23-05-2011 07:30 1680880

Цитата:

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

lxa85 23-05-2011 08:19 1680890

Цитата:

Цитата Gooch
я не нашел в описании printf »

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

Gooch 23-05-2011 08:53 1680908

Цитата:

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

для чего?

Цитата:

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

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

Цитата:

Цитата lxa85
И ничего у нас не поменялось. »

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

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

lxa85 23-05-2011 09:39 1680924

Цитата:

Цитата Gooch
для чего? »

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

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

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

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

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

Gooch 23-05-2011 12:29 1680995

Цитата:

Цитата lxa85
На "кофейной гуще" сложно сказать. Какая среда разработки? »

Visual Studio 2010 C++
Код:

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

Цитата:

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

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

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

Gooch 24-05-2011 11:09 1681586

Код:

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 24-05-2011 19:26 1681904

Цитата:

Цитата Gooch
JNE bit

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

Gooch 24-05-2011 19:44 1681911

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

Код:

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 должен остаться без значения? или я ошибаюсь?

lxa85 24-05-2011 21:49 1681973

Почему rez должен остаться без значения? Ты же его явно вводишь:
Цитата:

Цитата Gooch
INT8 rez=0; »

Цитата:

Цитата Gooch
MOV cl,x //проверка Х на значение не 0
CMP cl,1
JNZ bit
MOV cl,x
CMP cl,0
JZ prog
»

что-то глупость какая-то по моему. Заносим x, сравниваем с 1, допустим не равно - выполняем программу.
Равно - идем дальше - проверяем на равенство 0 и x - равно - выходим, не равно - выполняем программу.
Не понимаю я этих манипуляций.
Приложи весь исходник, я в NetBeans посмотрю.

Gooch 25-05-2011 17:11 1682400

Код:

#include "stdafx.h"
#include "iostream"
#include "windows.h"

//Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом вправо и потерей крайнего бита.
INT8 assembler(INT8 z, INT8 x)
{
    INT8 rez=0;
   
    __asm
    {
                MOV cl,x //проверка Х на значение не 0
            CMP cl,1
                JNZ bit

                               
cicle: //берём rez  и записываем в al, в rez должно быть 10000000, после чего
                //сдвигаем значение на 1 бит, после чего в зависимости от z повторяем цикл
                MOV al,rez
                SHR al,1
                MOV rez,al
                INC cl
                CMP cl,z
                JB cicle
               
                JMP end

                bit:
                MOV al,0
                MOV cl,80H
            ADD al,cl
                MOV rez,al
       
                end:
        }
       
return rez;

}

void main()
{
int  z, y, x;
    system("title Вычисление значения выражения");
    setlocale(LC_ALL,"Russian");
        printf("\n");
    printf("Введите значение бита (0 или 1): \n");
    scanf_s("%d",&x);
    printf("Введите номер бита (от 0 до 7): \n");
    scanf_s("%d",&y);
  if (y==7)
  {
        z=0;
  }
  if (y==6)
  {
    z=1;
  }
  if (y==5)
  {
        z=2;
  }
  if (y==4)
  {
    z=3;
  }
  if (y==3)
  {
    z=4;
  }
  if (y==2)
  {
        z=5;
  }
  if (y==1)
  {
        z=6;
  }
  if (y==0)
  {
  z=7;
  }
      printf("Ответ = %i\n",assembler(z, x));
 system("pause");
}

вообщем как то так....почему то я думаю что совсем не правильно делаю:( и ещё не знаю как сделать так, чтобы с 0 работало.


Время: 21:20.

Время: 21:20.
© OSzone.net 2001-