- •Архитектура эвм и систем.
- •Стороженко а.С.
- •Валюкевич н.Е.
- •Оглавление
- •Введение Архитектура персонального компьютера
- •Набор регистров
- •Регистры состояния и управления
- •Организация памяти
- •Типы данных
- •Лабораторная работа №1 Применение inline assembler
- •Краткая теория
- •Функции ввода-вывода
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №2 Линейное программирование
- •Краткая теория
- •Команды пересылки данных
- •Арифметические команды
- •Сложение двоичных чисел без знака
- •Вычитание двоичных чисел без знака
- •Умножение двоичных чисел со знаком
- •Деление двоичных чисел со знаком
- •Преобразование типов
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №3 Организация ветвлений в программе
- •Краткая теория
- •Команда сравнения cmp
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №4 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №5 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №6 Работа с дисассемблером
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Список рекомендованной литературы
- •Список дополнительной литературы
Функции ввода-вывода
Работа в среде Visual Studio (в режиме консольных приложений) сопряжена с определенными неудобствами, вызванными различными стандартами кодировки символов кириллицы в операционных системах MS DOS и Windows. Это происходит вследствие того, что весь ввод-вывод в консольных приложениях проходит в кодировке стандарта ANSII, а текст в исходных файлах, набираемый в текстовом редакторе Visual Studio имеет кодировку в стандарте ANSI. Поэтому для нормального вывода строки, содержащей буквы русского алфавита, эту строку необходимо сначала «пропустить» через функцию CharToOemA(), а уже потом отправлять на консольный вывод.
С учетом выше сказанного можно написать вывод русских букв следующем образом:
01 #include "stdafx.h"
02 #include <iostream>
03 #include <windows.h>
04 using namespace std;
05 char * RUS(const char * text);
06 int _tmain(int argc, _TCHAR* argv[])
07 {
08 cout<<RUS("Привет");
09 system("pause");
10 return 0;
11 }
12 char bufRus[250];
13 char * RUS(const char * text)
14 {
15 CharToOemA(text,bufRus);
16 return bufRus;
17 }
Рассмотрим приведенный листинг более подробно. В строках 1, 2 и 3 подключаются библиотеки. Первая необходима для всех файлов с расширением cpp, а вторая необходима для корректной работы функции русификации. В третьей строке описывается подключение библиотеки для организации операций ввода/вывода. На 04 строке подключается пространство имен std, это необходимо, для того чтобы применять операции чтения с клавиатуры (cin) и вывода на экран (cout) в сокращенном виде. Не в сокращенном виде название этих операций будет std::cin и std::cout соответственно.
Строка 05 содержит объявление функции с именем RUS. Строка № 6 содержит начало описания функции _tmain которая будет выполняться первой. Строка 8 выводит на экран слово «Привет», а 9 строка вызывает системную функцию Windows для остановки вашего приложения пока пользователь не нажмет на какую либо клавишу. Это действие необходимо производить перед каждым завершением вашей программы, в противном случае консольное окно закроется, и вы не успеете посмотреть выведенные на экран результаты работы программы. Строка 10 содержит оператор выхода из функции _tmain, что эквивалентно завершению программы. Строка 11 содержит символ } закрывающий блок описания функции _tmain (в строке 7 содержится символ { открывающий бок описания этой функции).
Строка № 05 и строки с 12 по 17 необходимы для работы функции русификации.
Помимо операторов языка С++ в программный код можно вставлять код на языке ассемблер. Это можно выполнить несколькими способами, с обязательным указанием служебного слова __asm:
1. __asm оператор ассемблера;
2. __asm
{
оператор1
оператор2
…
операторN
}
3. __asm оператор1
__asm оператор2
…
__asm операторN
Пример
Необходимо написать программу, которая вычисляет сумму двух целых чисел. Значения слагаемых взять с клавиатуры. Ниже приведен листинг программы выполняющей это действие.
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int num1,num2,rez;
cout<<"Enter num1=";
cin>>num1;
cout<<"Enter num2=";
cin>>num2;
__asm
{
mov eax,num1
add eax,num2
mov rez,eax
}
cout<<"Rezult:"<<rez<<endl;
system("pause");
return 0;
}
