1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
1

Вставка значения в определённый бит в двухбайтной ячейке памяти с потерей крайнего бита

20.03.2013, 17:55. Показов 1855. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Есть такой код, реализованный, как вставка в Си:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <iostream>
int main(){
    setlocale(0,"");
    short int place;
    short int value;
    short int bit;
    printf("В этой программе мы реализуем с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом влево и потерей крайнего бита.\n");
    printf("Введите то, что должно храниться в ячейке памяти (число от -128 до 127): ");
    scanf("%hi", &value);
    printf("Введите нужное значение (0 или 1): ");
    scanf("%hi", &bit);
    printf("Введите место, в которое надо вставить значение: ");
    scanf("%hi",&place);                  
    _asm{                               
                    mov ax, value
                    mov cx, 15
cycle:              
                    cmp cx, place
                    je insert
                    bt ax, cx-1
                    jnc otr
                    bts ax, cx
                    jmp pos
otr:                
                    btr ax, cx
pos:                
                    loop cycle
insert:             
                    bt bit, 0
                    jnc negins
                    bts ax, cx
                    jmp afterinsert
negins:             
                    btr ax, cx
afterinsert:        
                    mov value, ax           
 
    }
    printf("Результат: %hi\n", value);
return 0;
}
По идее, в цикле должно проверяться равенство счётчика переменной place, если равны, перепрыгиваем на метку insert, где через btr/bts устанавливаем вместо текущего бита нулевой бит переменной bit, если не равны, то по тому же принципу устанавливаем значение для текущего бита такое же, как и у следующего.
Но на деле, программа выполняет просто вставку значения без сдвига.
Где косяк? Помогите, пожалуйста!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2013, 17:55
Ответы с готовыми решениями:

Используя формулу x&(x-1), написать функцию обнуления крайнего справа единичного бита в целом числе x
2. Используя формулу x&amp;(x-1), написать функцию обнуления крайнего справа единичного бита в целом...

[Win32] Сдвиньте первый элемент на 1 бит влево, второй - на 2 бита вправо, третий - на 3 бита влево и т.д.
Объявите массив из 8 слов без знака.Сдвиньте первый элемент на 1 бит влево, второй элемент -на 2...

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

При появлении в ячейке файла Excel эмпортируемого значения (любого символа), необходимо открыть определенный файл
Добрый день! Нужен код: налажен экспорт данных в Эксель через ДДЕ сервер. При появлении в ячейки...

2
73 / 74 / 4
Регистрация: 25.09.2012
Сообщений: 211
20.03.2013, 23:42 2
sicknessed, Хороший вопрос! Во-первых, я попробовал скомпилировать на масме32 следующую конструкцию:
Цитата Сообщение от sicknessed Посмотреть сообщение
bt ax, cx-1
после чего компилятор выдал ошибку.
error A2031: must be index or base register
Потестив вашу программу в десятой студии, я выяснил, что программа работает в точности как вы и описали. Указанная выше инструкция читается компилятором как ошибочная и судя по дебагу заменяется такой:
Assembler
1
bt ax, cx
Просто замените ошибочную инструкцию на такой код:
Assembler
1
2
3
dec cx
bt ax, cx
inc cx
И вуаля, работает!
1
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
21.03.2013, 16:17  [ТС] 3
Цитата Сообщение от arzrav Посмотреть сообщение
sicknessed, Хороший вопрос! Во-первых, я попробовал скомпилировать на масме32 следующую конструкцию:

после чего компилятор выдал ошибку.

Потестив вашу программу в десятой студии, я выяснил, что программа работает в точности как вы и описали. Указанная выше инструкция читается компилятором как ошибочная и судя по дебагу заменяется такой:
Assembler
1
bt ax, cx
Просто замените ошибочную инструкцию на такой код:
Assembler
1
2
3
dec cx
bt ax, cx
inc cx
И вуаля, работает!
Спасибо, действительно работает!
0
21.03.2013, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2013, 16:17
Помогаю со студенческими работами здесь

Из 32 бит в 64 бита. Подскажите
Здравствуйте))) Я написала программу на 32 бита, скомпилировала - всё работает как надо) НО как...

Быстродействие 32-а бита vs 16-ти бит.
У меня вот такой вопрос, если взять 32 битные регистры то программа будет работать медленнее чем...

Преобразовать 2 регистра 16 бит в 32 бита float
Подскажите, по modbus принимаю 2 регистра 16 бит, их необходимо преобразовать в 32 бита float?

Нужно перекодировать картинку из 32 бит в 24 бита
Нужно перекодировать картинку из 32 бит в 24 бита потом в 16, 8, 4, 2 . Как это сделать и с чего...

Как найти абсциссу самого крайнего значения графика функции
Добрый день! Есть функция, которая задается кусочным образом. по картинке слева направо, от 0 до...

Как обнулить три старших бита регистра DH, без изменения остальных бит
Результат надо сохранить в регистре ВН


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru