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