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

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

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

В ax лежит последовательность из битов : например 1011001101001001 те в ah (10110011) и в al (01001001) , и необходимо зеркально отобразить al в ah ,т.е результат должен быть таким (1001001001001001), первая мысль массив, а как реализиовать не знаю да и по любому есть способ по-лучше, пишу в ассемблерными вставками на СИ. Подскажите как сделать так ...
#include<stdio.h>
#include<iostream>
int main(){
    setlocale(LC_ALL, "Russian");
short rez;
int f;
unsigned char rzag;
__asm {
 
    //mov ds, ax
    xor bl, bl
    mov cl, 8
    mov ax, 0000000001011001b
    m1 :
    rcl al, 1
        rcr bl, 1
        loop m1
 
        mov al, bl
        mov ah, al
 
mov rzag, ah

}

std::cout << "При расчет на языке Assembler получилось: " << rzag ;
system("pause");
 
}
Вот так вот, но почему-то Assembler не выдает результат хотя в переменных он лежит верный

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

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
 
int main(void)
{
char dig;
unsigned char x=0,i;
unsigned short y;
 
printf("AL=");       // Ввод байта в двоичном виде (строго 8 цифр)
for(i=0;i<8;i++)
 {
 scanf("%c",&dig);
 x<<=1;
 x+=dig-0x30;
 }
 
__asm                // Само зеркалирование
 {
 mov al,x
 mov ecx,8
 m1:rol al,1
    rcr ah,1
    loop m1
 mov y,ax
 }
 
printf("AX=",y);     // Вывод AX
for(i=0;i<16;i++)
 {
 dig=y&0x8000?'1':'0';
 printf("%c",dig);
 y<<=1;
 }
_getch();
return (0);
}

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

  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