Упаковка и распаковка битовых групп. - Assembler
Формулировка задачи:
Добрый день, у меня лабораторные по Архитетуре, вроде написал вроде правильно, а с данными чертовщина.
Одна программа у меня разбивает число на "группы" вторая собирает из них, но вот что-то я потестил и так и сяк не сходится, скорее всего я не правильно что-то делаю. Буду признателен за помощь.
Программа которая разбирает
Программа которая собирает все
Укажите мне на проблему, потому что вроде все делаю по методичке, а результаты разные. Заранее спасибо.
#include <stdio.h> #include <locale.h> int main() { setlocale(LC_ALL, "Russian"); unsigned long value; unsigned short mod, reg, mod_a, reg_a; //8 > x >=16 unsigned char kop, scale, kop_a, scale_a; //0 > x >=8 for (;;) { printf("Ввведите число: "); scanf_s("%x", &value); /*mod = value & 0x1FF; kop = (value >> 9) & 0x1F; reg = (value >> 14) & 0x7FF; scale = (value >> 25) & 0x3F;*/ scale = value & 0x3F; reg = (value >> 7) & 0x7FF; kop = (value >> 18) & 0x1F; mod = (value >> 23) & 0x1FF; printf("\n\n\t\t ======C====== \n"); printf("\n mod:%d\n kop: %d\n reg: %d\n scale: %d\n\n", mod, kop, reg, scale); __asm { mov eax, value // выделить 9 mov scale_a, al and scale_a, 0x3f shr eax, 7 // выделить 11 mov reg_a, ax and reg_a, 0x7ff shr eax, 11 // выделить 5 mov kop_a, al and kop_a, 0x1F shr eax, 5 // выделить 7 mov mod_a, ax and mod_a, 0x1ff } printf("\n\n\t\t ======ASM====== \n"); printf("\n mod:%d\n kop: %d\n reg: %d\n scale: %d\n\n", mod_a, kop_a, reg_a, scale_a); } return 0; }
#include <stdio.h> #include <locale.h> int main() { setlocale(LC_ALL, "Russian"); unsigned long value, value_a; unsigned short mod, reg, mod_a, reg_a; //8 > x >=16 unsigned char kop, scale, kop_a, scale_a; //0 > x >=8 unsigned short tmp; for (;;) { printf("\nВвведите три цифры: "); scanf_s("%hx", &mod); printf("\nВвведите две цифры: "); scanf_s("%hx", &tmp); kop = tmp; printf("\nВвведите четыре цифры: "); scanf_s("%hx", ®); printf("\nВвведите три цифры: "); scanf_s("%hx", &tmp); scale = tmp; mod_a = mod, kop_a = kop, reg_a = reg, scale_a = scale; mod &= 0x1ff; kop &= 0x1F; reg &= 0x7FF; scale &= 0x3F; value = mod; value = (value << 5) | kop; value = (value << 11) | reg; value = (value << 7) | scale; printf("value(C):%d\n", value); __asm { ; 22 : mod &= 0x1ff; movzx edx, mod_a and edx, 511; 000001ffH mov mod_a, dx ; 23 : kop &= 0x1F; movzx eax, kop_a and eax, 31; 0000001fH mov kop_a, al ; 24 : reg &= 0x7FF; movzx ecx, reg_a and ecx, 2047; 000007ffH mov reg_a, cx ; 25 : scale &= 0x3F; movzx edx, scale_a and edx, 63; 0000003fH mov scale_a, dl ; 26 : ; 27 : value = mod; movzx eax, mod_a mov value_a, eax ; 28 : value = (value << 5) | kop; mov ecx, value_a shl ecx, 5 movzx edx, kop_a or ecx, edx mov value_a, ecx ; 29 : value = (value << 11) | reg; mov eax, value_a shl eax, 11; 0000000bH movzx ecx, reg_a or eax, ecx mov value_a, eax ; 30 : value = (value << 7) | scale; mov edx, value_a shl edx, 7 movzx eax, scale_a or edx, eax mov value_a, edx } printf("value(ASM):%d", value_a); } return 0; }
Решение задачи: «Упаковка и распаковка битовых групп.»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <locale.h> #define __BITS_GROUP_SCALE__ 7 #define __BITS_GROUP_REG__ 11 #define __BITS_GROUP_KOP__ 5 #define __BITS_GROUP_MOD__ 9 int main() { setlocale(LC_ALL, "Russian"); unsigned long value; unsigned short mod, reg, mod_a, reg_a; //8 > x >=16 unsigned char kop, scale, kop_a, scale_a; //0 > x >=8 value = 123456; scale = value & 0x7F; reg = (value >> 7) & 0x7FF; kop = (value >> (7+11)) & 0x1F; mod = (value >> (7+11+5)) & 0x1FF; printf("\n\n\t\t ======C====== \n"); printf("\n mod:%d\n kop: %d\n reg: %d\n scale: %d\n\n", mod, kop, reg, scale); //--------------------------------------------- value = mod; value = (value << 5) | kop; value = (value << 11) | reg; value = (value << 7) | scale; printf("value(C):%d\n", value); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются макросы, которые будут использоваться в коде (в данном случае, это размеры битовых групп)
- Задается значение переменной
value
- Выделяются битовые группы:
scale
(7-битная группа),reg
(11-битная группа),kop
(5-битная группа),mod
(9-битная группа) - Выводится на экран значение выделенных битовых групп
- Производится распаковка битовых групп в переменную
value
- Выводится на экран полученное значение переменной
value
- Код завершается, возвращая 0