Упаковка и распаковка битовых групп. - 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", &reg);
        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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяются макросы, которые будут использоваться в коде (в данном случае, это размеры битовых групп)
  3. Задается значение переменной value
  4. Выделяются битовые группы: scale (7-битная группа), reg (11-битная группа), kop (5-битная группа), mod (9-битная группа)
  5. Выводится на экран значение выделенных битовых групп
  6. Производится распаковка битовых групп в переменную value
  7. Выводится на экран полученное значение переменной value
  8. Код завершается, возвращая 0

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы