PDA

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


Gooch
22-05-2011, 21:55
Всем привет, тема задания битовые операции. Программы реализуются как ассемблерные вставки в языке высшего уровня (С++).

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

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

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

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

Gooch
23-05-2011, 07:30
в чем именно трудность? »
я не нашел в описании printf на с++ как сделать вывод в двоичной форме :(

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

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


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

Gooch
23-05-2011, 08:53
И надо будет тебе подумать, как разбить регистр на две неравные части. »
для чего?

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

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

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

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

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

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

Gooch
23-05-2011, 12:29
На "кофейной гуще" сложно сказать. Какая среда разработки? »
Visual Studio 2010 C++

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


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

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

Gooch
24-05-2011, 11:09
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
JNE bit
JNE - Jump Not Equal Переход в случае НЕравенства.
Когда вводится число отличное от единицы (а не нуля), будет осуществлен переход. (cmp cl, 1)
Дальнейшая ассемблерная вставка мне не ясна, поэтому оставляю ее на твое усмотрение.

Gooch
24-05-2011, 19:44
ок...передел


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
Почему rez должен остаться без значения? Ты же его явно вводишь:
INT8 rez=0; »
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
#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 работало.




© OSzone.net 2001-2012