Assm - Помогите разобраться с задачей.
-
Gooch
Assm - Помогите разобраться с задачей.
Всем привет, тема задания битовые операции. Программы реализуются как ассемблерные вставки в языке высшего уровня (С++).
Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом вправо и потерей крайнего бита.
Может кто делал подобные? Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение. Если по моим представлениям делать задачу то получается большой код. Так же вызывает затруднение вывод на экран двоичного значения регистра.
Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом вправо и потерей крайнего бита.
Может кто делал подобные? Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение. Если по моим представлениям делать задачу то получается большой код. Так же вызывает затруднение вывод на экран двоичного значения регистра.
-
lxa85
Re: Assm - Помогите разобраться с задачей.
Gooch, задание понятно, всплывает с периодичностью в год. По расписанию лабораторных занятий.
Цитата Gooch:
Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение.
точно так.
Цитата Gooch:
Если по моим представлениям делать задачу то получается большой код.
Вовсе нет.
Цитата Gooch:
Так же вызывает затруднение вывод на экран двоичного значения регистра.
в чем именно трудность?
Вообще желательно бы видеть рассуждения "вслух".
Цитата Gooch:
Я понял задание так, ввести с клавиатуры значение бита и номер бита в который надо вписать значение.
Assm - Помогите разобраться с задачей.
точно так.
Цитата Gooch:
Если по моим представлениям делать задачу то получается большой код.
Assm - Помогите разобраться с задачей.
Вовсе нет.
Цитата Gooch:
Так же вызывает затруднение вывод на экран двоичного значения регистра.
Assm - Помогите разобраться с задачей.
в чем именно трудность?
Вообще желательно бы видеть рассуждения "вслух".
-
lxa85
Re: Assm - Помогите разобраться с задачей.
Цитата lxa85:
в чем именно трудность?
я не нашел в описании printf на с++ как сделать вывод в двоичной форме
Цитата lxa85:
Вообще желательно бы видеть рассуждения "вслух".
вводим переменную Х, так как ввод с клавиатуры будет в десятичной форме, то сделал следующее:
Код:
Далее я пробовал вывести значение переменной rez в HEX форме, но почему то выводит пустую ячейку
и по-этому дальше пока ни чего не делал. Вообще думаю дальше сделать ввод переменной Y в котороя будет указывать на номер бита и в зависимости от значения Y делать сдвиг вправо.
в чем именно трудность?
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 - Помогите разобраться с задачей.
Цитата Gooch:
я не нашел в описании printf
не printf'ом единым жив программист. В задании четко обозначены циклы - используй их. Циклический сдвиг и все такое.
----
А вот приведенный код не понятен.
Занесли мы единицу в старший бит, и что? Кстати ввод единицы сделан не правильно. ЕМНИП в данном случае будет воспринята 10чная система. Чтобы указать, что 80 - это 16ричная система счисления, необходима дополнительная конструкция. 0x80, но все равно проверь в справочнике.
Ну, занесли 1цу, потом передали регистр в rez, без модификаций. И ничего у нас не поменялось.
----
Да, конечно, дополнительная переменная, определяющая позицию просто необходима.
----
И надо будет тебе подумать, как разбить регистр на две неравные части. Т.е. подумать с логической разбивкой, экранированием и т.п.
я не нашел в описании printf
Assm - Помогите разобраться с задачей.
не printf'ом единым жив программист. В задании четко обозначены циклы - используй их. Циклический сдвиг и все такое.
----
А вот приведенный код не понятен.
Занесли мы единицу в старший бит, и что? Кстати ввод единицы сделан не правильно. ЕМНИП в данном случае будет воспринята 10чная система. Чтобы указать, что 80 - это 16ричная система счисления, необходима дополнительная конструкция. 0x80, но все равно проверь в справочнике.
Ну, занесли 1цу, потом передали регистр в rez, без модификаций. И ничего у нас не поменялось.
----
Да, конечно, дополнительная переменная, определяющая позицию просто необходима.
----
И надо будет тебе подумать, как разбить регистр на две неравные части. Т.е. подумать с логической разбивкой, экранированием и т.п.
-
Gooch
Re: Assm - Помогите разобраться с задачей.
Цитата lxa85:
И надо будет тебе подумать, как разбить регистр на две неравные части.
для чего?
Цитата lxa85:
Ну, занесли 1цу, потом передали регистр в rez, без модификаций.
какие модификации имеется ввиду?
Цитата lxa85:
И ничего у нас не поменялось.
привиденный код не полный, это только значение переменной X, после метки prog будет дальше код программы.
И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой?
И надо будет тебе подумать, как разбить регистр на две неравные части.
Assm - Помогите разобраться с задачей.
для чего?
Цитата lxa85:
Ну, занесли 1цу, потом передали регистр в rez, без модификаций.
Assm - Помогите разобраться с задачей.
какие модификации имеется ввиду?
Цитата lxa85:
И ничего у нас не поменялось.
Assm - Помогите разобраться с задачей.
привиденный код не полный, это только значение переменной X, после метки prog будет дальше код программы.
И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой?
-
Gooch
Re: Assm - Помогите разобраться с задачей.
Цитата Gooch:
для чего?
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
Цитата Gooch:
какие модификации имеется ввиду?
Ну ты передал в регистр единицу, а потом сразу регистр отправил в память в переменную rez. Я это имел ввиду.
Цитата Gooch:
И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой?
На "кофейной гуще" сложно сказать.
Какая среда разработки? Может неправильно спрашиваешь? Может binary формат поставить?
для чего?
Assm - Помогите разобраться с задачей.
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
Цитата Gooch:
какие модификации имеется ввиду?
Assm - Помогите разобраться с задачей.
Ну ты передал в регистр единицу, а потом сразу регистр отправил в память в переменную rez. Я это имел ввиду.
Цитата Gooch:
И всё таки почему у меня не выводит ни чего на экран когда я хочу попробывать посмотреть содержимое переменой?
Assm - Помогите разобраться с задачей.
На "кофейной гуще" сложно сказать.
Какая среда разработки? Может неправильно спрашиваешь? Может binary формат поставить?-
lxa85
Re: Assm - Помогите разобраться с задачей.
Цитата lxa85:
На "кофейной гуще" сложно сказать. Какая среда разработки?
Visual Studio 2010 C++
Код:
Цитата lxa85:
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
вот если честно то пока понятия не имею...
И где может быть ошибка?
На "кофейной гуще" сложно сказать. Какая среда разработки?
Assm - Помогите разобраться с задачей.
Visual Studio 2010 C++
Код:
Код: Выделить всё
printf("Введите значение бита (0 или 1): \n");
scanf_s("%d",&x);
printf("Ответ = %h\n",assembler(x));Цитата lxa85:
А как ты собрался вставлять определенный бит в байт, со сдвигом вправо?
Assm - Помогите разобраться с задачей.
вот если честно то пока понятия не имею...
И где может быть ошибка?
-
Gooch
Re: Assm - Помогите разобраться с задачей.
Код:
Вообщем как вставить определенный бит в байт со сдвигом я придумал, но вот проблема, не могу понять, почему когда я делаю условные переходы у меня в результате выходит 0
если переходы убрать, то код выполняется верно
Код: Выделить всё
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 - Помогите разобраться с задачей.
Код:
Вообщем как вставить определенный бит в байт со сдвигом я придумал, но вот проблема, не могу понять, почему когда я делаю условные переходы у меня в результате выходит 0
если переходы убрать, то код выполняется верно
Код: Выделить всё
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 - Помогите разобраться с задачей.
Цитата Gooch:
JNE bit
JNE - Jump Not Equal Переход в случае НЕравенства.
Когда вводится число отличное от единицы (а не нуля), будет осуществлен переход. (cmp cl, 1)
Дальнейшая ассемблерная вставка мне не ясна, поэтому оставляю ее на твое усмотрение.
JNE bit
JNE - Jump Not Equal Переход в случае НЕравенства.
Когда вводится число отличное от единицы (а не нуля), будет осуществлен переход. (cmp cl, 1)
Дальнейшая ассемблерная вставка мне не ясна, поэтому оставляю ее на твое усмотрение.