Зеркально отобразить байты из al в ah - Assembler
Формулировка задачи:
В ax лежит последовательность из битов : например 1011001101001001 те в ah (10110011) и в al (01001001) , и необходимо зеркально отобразить al в ah ,т.е результат должен быть таким (1001001001001001), первая мысль массив, а как реализиовать не знаю да и по любому есть способ по-лучше, пишу в ассемблерными вставками на СИ. Подскажите как сделать так ...
Вот так вот, но почему-то Assembler не выдает результат хотя в переменных он лежит верный
#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");
}Решение задачи: «Зеркально отобразить байты из 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);
}
Объяснение кода листинга программы
- Объявляются необходимые заголовочные файлы для использования функций ввода/вывода и задержки в консоли.
- Определяется функция int main(void) как главная точка входа в программу.
- Объявляются переменные dig, x, i и y.
- Выводится строка
AL=для приглашения пользователя ввести байт в двоичном виде. - Используется цикл for для считывания введенного байта посимвольно и преобразования его в числовое значение.
- Вступает блок __asm, указывающий на встраивание ассемблерного кода.
- Загружается значение переменной x в AL регистр.
- Загружается значение 8 в ECX регистр.
- Внутри цикла m1 выполняются операции циклического сдвига битов влево и вправо.
- Значение AX регистра сохраняется в переменной y.
- Выводится сообщение
AX=для отображения значения регистра AX. - Используется цикл for для вывода битов значения AX поочередно.
- Определяется значение переменной dig в зависимости от значения самого левого бита переменной y.
- Выводится символ dig.
- Значение переменной y сдвигается на один бит влево.
- Используется функция _getch() для ожидания нажатия клавиши пользователем.
- Возвращается значение 0 из функции main(), чтобы указать успешное завершение программы.