Министерство Образования и Науки Российской Федерации
Новосибирский Государственный Технический Университет
Кафедра ПМт
Лабораторная работа №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 ;и символ туда же
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.