Что делают операнды в этом коде - Assembler
Формулировка задачи:
Суть проблемы:
учусь на Информатике, первый год. На втором семестре у нас появился предмет "Кпьютерная Архитектура" где нужно писать на Ассемблере, с замечательным преподавателем, который на лабораторных просто сидит и молчит, а на каждый вопрос отвечает -- погуглите, я не могу знать всего. Но разобраться всетаки хочеться.
Нашел решенные задания с прошлого года, но никак не могу разобраться в коде.
Прошу, если есть люди которым не лень разжевать мне материал, прокоментировать строчки кода ассемблера, что там собственно происходит, чтобы я мог разобраться в операторах и что они делают.
P.S. Не обращайте внимание на Польский язык
Лист заданий прилагаю:
1) Замена 4ох заглавных букв на малые.
2) Замена метами двух 4ехбуквенных слов.
3) Переплетение букв по очереди с двух слов. пример ABCD QWER -> AQBWCEDR
4) Суммирующая все элементы 3ех элементовой таблицы
7) Придающая переменной типа "байт" значение 1, если переменная типа "слово" делиться на 16 и значение 0 если не делиться.
8) Добавляющая переменную D типа байт к первому элементу таблицы состоящей их 4ох элементов, если D делиться на 2, и к четвертому элементу, если D не делиться на два.
9) Поднесение к девятой степени остаток с деления переменной типа "байт" на 8.
// Zadanie1 #include "stdafx.h" #include<iostream> #include<conio.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { unsigned char a,b,c,d; cin >> a; cin >> b; cin >> c; cin >> d; _asm { mov AL, a; add AL, 32; mov a, AL; mov AL, b; add AL, 32; mov b, AL; mov AL, c; add AL, 32; mov c, AL; mov AL, d; add AL, 32; mov d, AL; } cout << a << b << c << d; _getch(); return 0; } //Zadanie2 #include "stdafx.h" #include <iostream> #include<conio.h> using namespace std; char napis[4], napis2[4]; int i = 4; __int32 adr1, adr2, adr3; int _tmain(int argc, _TCHAR* argv[]) { cout << "Napis 1: "; cin >> napis; cout << "Napis 2: "; cin >> napis2; __asm { mov AL, napis[0]; mov BL, napis[1]; mov CL, napis[2]; mov DL, napis[3]; mov AH, napis2[0]; mov BH, napis2[1]; mov CH, napis2[2]; mov DH, napis2[3]; mov napis2[0], AL; mov napis2[1], BL; mov napis2[2], CL; mov napis2[3], DL; mov napis[0], AH; mov napis[1], BH; mov napis[2], CH; mov napis[3], DH; } cout << endl << napis << endl; cin.get(); _getch(); return 0; } //Zadanie3 #include "stdafx.h" #include<iostream> #include<conio.h.> using namespace std; char napis[3]; char slowo[3]; char wyraz[6]; int _tmain(int argc, _TCHAR* argv[]) { cin >> napis; cin >> slowo; _asm { mov AL, napis[0] mov wyraz[0], AL mov AL, slowo[0] mov wyraz[1], AL mov AL, napis[1] mov wyraz[2], AL mov AL, slowo[1] mov wyraz[3], AL mov AL, napis[2] mov wyraz[4], AL mov AL, slowo[2] mov wyraz[5], AL } cout << wyraz; _getch(); return 0; } //Zadanie4 cout « "Write 1st element: "; cin » tab[0]; cout « "Write 2nd element: "; cin » tab[1]; cout « "Write 3rd element: "; cin » tab[2]; int result = 0; __asm { mov EAX, offset tab; xor EBX, EBX; add BX, [EAX]; add BX, [EAX + 2]; add BX, [EAX + 4]; mov result, EBX; } cout « "The result is = " « result; _getch(); //zadanie 7 #include "stdafx.h" #include<iostream> #include<conio.h> using namespace std; int main() { short numer; cout << "Napisz swoj numer: "; cin >> numer; short result = 0; __asm { mov AX, numer; mov BX, 16; xor DX, DX; div bx; mul bx; mov bx, numer; div bx; mov result, AX; } cout << "Odpowiedz:" << result; _getch(); } //zadanie 8 #include "stdafx.h" #include<iostream> #include<conio.h> using namespace std; int main() { char tab1[3]; short int tab[4] = { 1, 2, 3, 4 }; __int8 input; cout << "Napisz swoj numer: " << endl; cin >> input; cout << "The tab is: " << tab1[0] << ";" << tab1[1] << ";" << tab1[2] << ";" << tab1[3] << endl; __asm { xor EAX, EAX; mov AL, input; mov EBX, offset tab1; add EBX, 6; and AL, 1; mov CL, 6; mul CL; sub EBX, EAX; xor ECX, ECX; mov CL, input; add[EBX], ECX; } cout << "Odpowiedz: " << tab1[0] << " tab 1 = " << tab1[1] << "tab 2 = " << tab1[2] << "Tab 3 = " << tab1[3]; _getch(); return 0; } //Zadanie9 #include "stdafx.h" #include<iostream> #include<conio.h.> using namespace std; int main() { __int8 number; cout << "Napish symbol: " << endl; cin >> number; cout >> "Nomer symbolu: " << int(number) << endl; int result; __asm { mov EAX, 0; mov AL, number; and AL, 7; mov EBX, EAX; mul EBX; mul EBX; mov EBX, EAX; mul EBX; mul EBX; mov result, EAX; } cout << "Rezultat: " << result; _getch(); }
Решение задачи: «Что делают операнды в этом коде»
textual
Листинг программы
//zadanie 7 //#include "stdafx.h" #include<iostream> #include<conio.h> using namespace std; int main() { short numer; cout << "Введите число: "; cin >> numer; short result = 0; __asm { mov AX, numer; db 0xD4, 16 //aam 16 - делим AX на 16 setz result // выставляем result // в соответствии с остатком от деления } cout << "Ответ:" << result; _getch(); };
Объяснение кода листинга программы
- В программе имеется переменная типа short - numer, в которую считывается число с помощью функции cin.
- Также имеется переменная типа short - result, которая инициализируется нулем.
- Далее следует блок кода на ассемблере, который выполняет следующие действия:
- Делит переменную numer на 16, используя инструкцию aam (деление с остатком).
- Использует инструкцию setz для выставления значения result в соответствии с остатком от деления.
- Результат выводится на экран с помощью функции cout.
- В конце программы используется функция _getch для приостановки выполнения программы до тех пор, пока пользователь не нажмет клавишу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д