Изучение основных операций ввода-вывода, работы с регистрами, работы с текстовыми данными (Лабораторная работа № 4)

Страницы работы

Содержание работы

Министерство Образования и Науки Российской Федерации

Новосибирский Государственный Технический Университет

Кафедра ПМт

Лабораторная работа №4

по дисциплине «Языки программирования и методы трансляции»

Факультет:                ПМИ

Группа:                      ПМ - 84

Студент:                    Нартова О.Ю.

                                    Шовкопляс Е.А.

Преподаватели:        Петров Р.В.

                                    Полетаева И.А.

Вариант:                    2

Новосибирск 2010

1)  Цель работы:

Изучение основных операций ввода-вывода, работы с регистрами, работы с текстовыми данными.

2)  Задание:

Разработать программу, реализующую

·  ввод с клавиатуры 2-х чисел в шестнадцатеричной системе счисления (не менее  3-х знаков каждое число)

·  Сложение этих чисел (считаем, что размер чисел не вызывает переполнения регистров)

·  вывод результата в десятичной системе счисления

·  все промежуточные данные должны сохраняться в программе

3)  Текст программы:

.386

.model flat, c

STD_OUTPUT_HANDLE       equ -11           ;стандартный вывод

STD_INPUT_HANDLE        equ -10           ;стандартный ввод

;Структура хранит информацию о позиции символа

COOR STRUC

 X WORD ?

 Y WORD ?

COOR ENDS

;Используемые внешние функции

EXTERN      _getch                                   : NEAR      ;получить символ

EXTERN      _putch                                   : NEAR      ;вывести символ

EXTERN      SetConsoleCursorPosition@8    : NEAR      ;установить позицию курсора

EXTERN      GetStdHandle@4                      : NEAR      ;получить описатели консоли

EXTERN      WriteConsoleA@20              : NEAR      ;вывести строку

EXTERN  wsprintfA                        : NEAR      ;вывести строку

.data

counter     dd          0                 ;длина считанной строки

number      dd          ?                 ;сформированное число

string      db          10 dup (?)  ;буфер для формирования числа

ptr1  dd          string            ;его адрес

num1  dd          ?                 ;первое число

num1str db        10 dup (?)  ;в строковом виде

num1ptr     dd          num1str           ;его адрес

num2  dd          ?                 ;второе число

num2str db        10 dup (?)  ;в строковом виде

num2ptr     dd          num2str           ;его адрес

nsum  dd          ?                 ;сумма

sumstr      db          10 dup (?)  ;в строковом виде

sumptr      dd          sumstr            ;его адрес

crd         coor  <0>               ;позиция курсора

STDIN dd          ?                 ;хэндл ввода консоли

STDOUT      dd          ?                 ;хэндл вывода консоли

;разные сообщения+их размеры

exitMsg db        13,10,"Press 'q' to exit, pls",13,10

emlen dd          emlen-exitMsg

get1  db          "1st number:         , in decimal: "

g1len dd          g1len-get1 

get2  db          "2nd number:         , in decimal: "

g2len dd          g2len-get2

sump  db          "sum: "

sumlen      dd          sumlen-sump

fmt         db          "%d",0

buf         db          120 dup (?)

lens  dd          ?

;секция кода

.code

;процедура читает число в шестнадцатиричном виде

;тут же выводит его, по мере считывания переводит в десятичный вид

;и тоже выводит

readhex     proc NEAR

            ;Инициализировали используемые регистры и переменные

            xor         eax,  eax

            mov         edi,  ptr1

            mov         counter, 0

            mov         number,  0

more: call  _getch                  ;считали символ

            ;проверили корректность ввода

            cmp         al,         '0'        

            jl          q

            cmp         al,         '9'

            jle         @3

            cmp         al,         'a'        

            jl          q

            cmp         al,         'f'

            jg          q

@3:         stosb                         ;переслали символ в строку на хранение

            ;установили позицию курсора

            dec         CRD.X

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;приготовились к выводу имеющейся строки

            mov         esi, ptr1

            mov         ecx, counter

            inc         ecx

;цикл вывода строки

r:          lodsb                         ;забрали символ из строки

            push  ecx                     ;сохранили счетчик в стеке

            push  eax                     ;и символ туда же

Похожие материалы

Информация о работе