Зеркально отобразить байты из 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(), чтобы указать успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д