Другие языки программирования и технологии

Обьясните принцип работы программы (Assembler)

Задача выполняет функцию перевода всех символов введённой вручную строки в 16тиричную систему, т. е. в их значения таблице ASCII.
Обьясните, пожалуйста по-подробнее по какому принципу работает эта программа. Благодарю
Сама программа ниже:
.model small
.stack 100h
.data
input_msg db 'Iveskite eilute:', 13, 10, '$'
max_len_buf db 121
len_buf db 0
buf db 121 dup (0)
output_msg db 'hex:', 13, 10
outpString db 364 dup (' ')
hex_table db '0123456789ABCDEF'
.code
start:
mov ax, @data
mov ds, ax
xor ax, ax ;

call input
call convertString
call output

mov ah,8
int 21h
mov ax,4c00h
int 21h

input proc
mov ah,9
mov dx,offset input_msg
int 21h
mov ah,0Ah
mov dx,offset max_len_buf
int 21h
mov ah,2
mov dl,10
int 21h
ret ;
endp

convertString proc
xor di,di
xor si,si
mov bx,offset hex_table
xor ch,ch
mov cl,len_buf
convertLoop:
call convertByte
loop convertLoop
mov outpString [ di ] ,'$'
ret
endp

convertByte proc
mov ah,buf [ si ]
mov al,ah
shr al,4
xlat
mov outpString [ di ] , al
inc di
mov al,ah
and al,0Fh
xlat
mov outpString [ di ] , al
inc di
inc di
inc si
ret
endp

output proc
mov dx,offset output_msg
mov ah,9
int 21h
ret
endp
.model small
.stack 100h
.data
input_msg db 'Iveskite eilute:', 13, 10, '$'
max_len_buf db 121
len_buf db 0
buf db 121 dup (0)
output_msg db 'hex:', 13, 10
outpString db 364 dup (' ')
hex_table db '0123456789ABCDEF'
.code
start:
mov ax, @data
mov ds, ax ; адресация
xor ax, ax ; зануление АХ

call input ; вызов процедуры ввода текста
call convertString ; процедура переведет и записывает в другой буфер коды символов
call output ; вывод результата на экран

mov ah,8
int 21h
mov ax,4c00h
int 21h

;описание процесса, "ввод текста"

input proc

mov ah,9 ; помещаем в АН функцию 09Н (выводит сообщение)

mov dx,offset input_msg ; помещаем смещение на выводимое сообщение в DX, тк 09 выводит сообение начиная с адреса DS:DX, заканчивает когда обнаружит '$'.

int 21h ; вызываем саму функцию хранящуюся в AH. (на экране появляется сообщение'Iveskite eilute:')

mov ah,0Ah ; функция 0Ah, записывает в заранее подготовленный буфер.

mov dx,offset max_len_buf ; адрес буфера, куда будет вводиться текст функцией 0АН

int 21h ; вызов самой функции, пользователь вводит текст

mov ah,2 ; помещаем функцию 02Н АН, функция выводит один символ кол которого находится в DL, если DL=10 то курсор возвращается в начало строки, если 13 то переход на следующую строку

mov dl,10; код выводимого = 10

int 21h ; выводим этот символ, в данном случае переход в начало строки

ret ; конец процедуры.
endp

;описание процедуры преобразования всех символов в их коды.
convertString proc
xor di,di ; зануляем Di и SI т. к они используются в дальнейшем
xor si,si
mov bx,offset hex_table
xor ch,ch
mov cl,len_buf ; помещаем в СХ длинну введеного текста, для организации цикла (прокрутит столько раз, сколько знаков в тексте)

convertLoop: ; начало цикла
call convertByte ; вызов процедуры, обрабатывающей каждый символ превращая его в 16тиричный код, ее описание далее.

loop convertLoop ; оператор loop уменьшает СХ на 1 сравнивает с 0 если не = то переходит на метку

mov outpString [ di ] ,'$' ; завершающий этап, ставим в конце получившейся строки '$', для дальнейшего вывода через 09Н
ret
endp

;процедура переводящая коды введеных символов в их визуальное изображение, т. е в строку
convertByte proc
mov ah,buf [ si ] ; помещаем из буфера один символ в AH

mov al,ah

shr al,4 ; смещам в АН биты, вправо (на 4 бита) , т. е в АL останется однозначное 16тиричное число (оно будет являться 1й частью кода символа взятого из буфера ввода)
xlat

mov outpString [ di ] , al ; записываем полученое число в буфер, где будет храниться общий результат программы;

; тоже самое почти, тока выявляем 2ю часть кода символа
inc di
mov al,ah ; в AH хранится весь код числа
and al,0Fh ; зануляем левую часть кода числа, ибо ее уже обработали
xlat

mov outpString [ di ] , al ; записываем вторую часть кода символа в следующий байт результирующего буфера;
inc di
inc di
inc si
ret ; таким образом мы обработали один символ введенного текста и получили его код в 16тиричном формате
endp

; процедура вывода результата на экран через 09Н, я думаю тут все понятно)) )
output proc
mov dx,offset output_msg
mov ah,9
int 21h
ret
endp
Дмитрий Золонцев
Дмитрий Золонцев
1 155
Лучший ответ
(Assembler) - это язык программирования наиболее близкий к машинным кодам. И мне не понятен вопрос. Что надо объяснить? Что каждая строчка обозначает? Для этого надо объяснять что такое стек акоммулятор регистор условный и безусловный переход и тд и тп
Андрей Бедник
Андрей Бедник
65 507