МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по практической работе №3
по дисциплине «Системное программирование»
Тема: “ Ввод чисел. Перевод чисел в различные системы счисления.”
Студенты гр. 8391 |
|
Орещенко Н.В. |
|
|
Перевертайло Д.А. |
|
|
Петрухина М.С. |
Преподаватель |
|
Кораблев Ю.А. |
Санкт-Петербург
2021
Цель работы: Научиться вводить в ассемблерную программу числовую информацию. Разработка алгоритмов для перевода чисел в различные системы счисления.
Задание: Разработать программу перевода чисел из десятичной системы счисления в двоичную, восьмеричную и шестнадцатеричную. Числа должны вводиться в десятичной системе счисления, а выводятся – в двоичной, восьмеричной и шестнадцатеричной.
1. Код COM-программы с комментариями
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, SS:CODE
ORG 100H
START:
;Ввод числа
MOV AH, 0AH
LEA DX, BUF
INT 21H
MOV AH, 02h
MOV DL, 0aH
INT 21H
;Перевод символов в десятичное число из МУ
MOV DI, 0
LEA BX, BUF+1
MOV CX, [BX]
XOR CH, CH
MOV SI, 1
met: PUSH SI
MOV SI, CX
MOV AL, [BX+SI]
XOR AH, AH
POP SI
SUB AL, 30h
MUL SI
ADD DI, AX
MOV AX, SI
MOV DX, 10
MUL DX
MOV SI, AX
LOOP met
;Перевод в двоичную СС
PUSH DI; сохраняем в стек десятичное число
LEA BX, BINBUF+1
MOV CX, 16; максимальное число 65535 (2 байта)
MOV [BX], CL; запись длины строки
MOV AL, 31h; единица в ASCII таблице
met2: MOV SI, CX ; двигаемся от младшего разряда к старшему
SHR DI, 1 ; сдвиг числа вправо на 1
JNC zero ; проверка флага CF
MOV [BX+SI], AL ; CF не равен 0 => записываем 1 (31h)
zero: LOOP met2
POP DI ; Достаем число из стека для перевода в другие СС
;Перевод в восьмеричную СС
PUSH DI
LEA BX, OCTBUF+1
MOV CX, 6h ; макс. длина строки в данной СС 6
MOV [BX], CL
met3: MOV AX, DI ; копируем число со сдвигом
MOV SI, CX
AND AX, 111b ; вычленяем младшие 3 бита
ADD AX, 30h ; переводим число в символ
MOV [BX+SI], AL
PUSH CX
MOV CX, 3h
SHR DI, CL ; смещаем число на 3 бита вправо
POP CX
LOOP met3
POP DI
;Перевод в шестнадцатеричную СС
PUSH DI
LEA BX, HEXBUF+1
MOV CX, 4h ; макс. длина строки в данной СС 4
MOV [BX], CL
met4: MOV AX, DI
MOV SI, CX
AND AX, 1111b ; Получаем смещение в таблице соответствия
PUSH SI
MOV SI, AX
MOV DL, [HEXSTR+SI] ; Достаем символ из таблицы
POP SI
MOV [BX+SI], DL
PUSH CX
MOV CX, 4h
SHR DI, CL; смещаем число на 4 бита вправо
POP CX
LOOP met4
POP DI
;Вывод
MOV AH, 09h
LEA DX, BINBUF+2 ; Двоичная запись
INT 21H
MOV AH, 02h
MOV DL, 0aH
INT 21H
MOV AH, 09h
LEA DX, OCTBUF+2 ; Восьмеричная запись
INT 21H
MOV AH, 02h
MOV DL, 0aH
INT 21H
MOV AH, 09h
LEA DX, HEXBUF+2 ; Шестнадцатеричная запись
INT 21H
; Завершение программы
MOV AH, 4CH
INT 21H
; Объявление буферов
BUF DB 6, 00, 6 DUP ('$')
BINBUF DB 16, 00, 16 DUP (30h), '$'
OCTBUF DB 6, 00, 6 DUP (?), '$'
HEXBUF DB 4, 00, 4 DUP (?), '$'
HEXSTR DB '0123456789ABCDEF'
CODE ENDS
END START
2. Пример выполнения работы программы
Рис.1 Пример выполнения работы программы
3. Задание на защиту
Введите с клавиатуры число в шестнадцатеричном формате и выведите его в десятичном виде.
Код программы:
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, SS:CODE
ORG 100H
START:
MOV AH, 0AH
LEA DX, BUF
INT 21H
MOV DI, 0
LEA BX, BUF+1
MOV CX, [BX]
XOR CH, CH
MOV SI, 1
met: PUSH SI
MOV SI, CX
MOV AL, [BX+SI]
XOR AH, AH
MOV DL, 30h
CMP AL, 41h
JL num
ADD DL, 7h
num: POP SI
SUB AL, DL
MUL SI
ADD DI, AX
MOV AX, SI
MOV DX, 16
MUL DX
MOV SI, AX
LOOP met
LEA BX, decbuf+1
MOV CX, 5
MOV [BX], CL
MOV AX, DI
met2: PUSH BX
XOR DX, DX
MOV BX, 10
DIV BX
ADD DX, 30h
POP BX
MOV SI, CX
MOV [BX+SI], DL
LOOP met2
MOV AH, 02h
MOV DL, 0aH
INT 21H
MOV AH, 09h
INC BX
LEA DX, [BX]
INT 21H
MOV AH, 4CH
INT 21H
BUF DB 5, 0, 4 DUP ('$'), '$'
decbuf DB 5, 01, 5 DUP (?),'$'
CODE ENDS
END START
Рис.2 Пример выполнения работы программы на защиту