Зеркально отобразить байты из al в ah - Assembler

Узнай цену своей работы

Формулировка задачи:

В ax лежит последовательность из битов : например 1011001101001001 те в ah (10110011) и в al (01001001) , и необходимо зеркально отобразить al в ah ,т.е результат должен быть таким (1001001001001001), первая мысль массив, а как реализиовать не знаю да и по любому есть способ по-лучше, пишу в ассемблерными вставками на СИ. Подскажите как сделать так ...
Листинг программы
  1. #include<stdio.h>
  2. #include<iostream>
  3. int main(){
  4. setlocale(LC_ALL, "Russian");
  5. short rez;
  6. int f;
  7. unsigned char rzag;
  8. __asm {
  9. //mov ds, ax
  10. xor bl, bl
  11. mov cl, 8
  12. mov ax, 0000000001011001b
  13. m1 :
  14. rcl al, 1
  15. rcr bl, 1
  16. loop m1
  17. mov al, bl
  18. mov ah, al
  19. mov rzag, ah
  20.  
  21. }
  22.  
  23. std::cout << "При расчет на языке Assembler получилось: " << rzag ;
  24. system("pause");
  25. }
Вот так вот, но почему-то Assembler не выдает результат хотя в переменных он лежит верный

Решение задачи: «Зеркально отобразить байты из al в ah»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. int main(void)
  5. {
  6. char dig;
  7. unsigned char x=0,i;
  8. unsigned short y;
  9.  
  10. printf("AL=");       // Ввод байта в двоичном виде (строго 8 цифр)
  11. for(i=0;i<8;i++)
  12.  {
  13.  scanf("%c",&dig);
  14.  x<<=1;
  15.  x+=dig-0x30;
  16.  }
  17.  
  18. __asm                // Само зеркалирование
  19.  {
  20.  mov al,x
  21.  mov ecx,8
  22.  m1:rol al,1
  23.     rcr ah,1
  24.     loop m1
  25.  mov y,ax
  26.  }
  27.  
  28. printf("AX=",y);     // Вывод AX
  29. for(i=0;i<16;i++)
  30.  {
  31.  dig=y&0x8000?'1':'0';
  32.  printf("%c",dig);
  33.  y<<=1;
  34.  }
  35. _getch();
  36. return (0);
  37. }

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

  1. Объявляются необходимые заголовочные файлы для использования функций ввода/вывода и задержки в консоли.
  2. Определяется функция int main(void) как главная точка входа в программу.
  3. Объявляются переменные dig, x, i и y.
  4. Выводится строка AL= для приглашения пользователя ввести байт в двоичном виде.
  5. Используется цикл for для считывания введенного байта посимвольно и преобразования его в числовое значение.
  6. Вступает блок __asm, указывающий на встраивание ассемблерного кода.
  7. Загружается значение переменной x в AL регистр.
  8. Загружается значение 8 в ECX регистр.
  9. Внутри цикла m1 выполняются операции циклического сдвига битов влево и вправо.
  10. Значение AX регистра сохраняется в переменной y.
  11. Выводится сообщение AX= для отображения значения регистра AX.
  12. Используется цикл for для вывода битов значения AX поочередно.
  13. Определяется значение переменной dig в зависимости от значения самого левого бита переменной y.
  14. Выводится символ dig.
  15. Значение переменной y сдвигается на один бит влево.
  16. Используется функция _getch() для ожидания нажатия клавиши пользователем.
  17. Возвращается значение 0 из функции main(), чтобы указать успешное завершение программы.

ИИ поможет Вам:


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

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

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут