[MASM] Ввод строки цифр и преобразование её в число - Assembler
Формулировка задачи:
Необходимо, запросить строку символов, положить в di соответствующее число.
То есть пользователь вводит 65345 в di должно быть 65345d
Вводит 12 - в di 12d
Помогите пожалуйста, я в ассемблере ноль, желательно с пояснениями по возможности)
За раннее спасибо)
Решение задачи: «[MASM] Ввод строки цифр и преобразование её в число»
textual
Листинг программы
.MODEL Small .DATA KeyBuf db 6, 0, 6 dup(0) ;max,len,string,CR(0dh) CR_LF db 0Dh, 0Ah, '$' Prompt db 'Введите число: ', '$' Error01 db 'Ошибка ввода числа',0Dh, 0Ah, '$' Numer dw ? .CODE ; преобразования строки в число ; на входе: ; ds:[si] - строка с числом ; ds:[di] - адрес числа ; на выходе ; ds:[di] - число ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен) Str2Num PROC push ax push bx push cx push dx push ds push es push ds pop es mov cl, ds:[si] xor ch, ch inc si mov bx, 10 xor ax, ax @@Loop: mul bx ; умножаем ax на 10 ( dx:ax=ax*bx ) mov [di], ax ; игнорируем старшее слово cmp dx, 0 ; проверяем, результат на переполнение jnz @@Error mov al, [si] ; Преобразуем следующий символ в число cmp al, '0' jb @@Error cmp al, '9' ja @@Error sub al, '0' xor ah, ah add ax, [di] jc @@Error ; Если сумма больше 65535 inc si loop @@Loop mov [di], ax clc pop es pop ds pop dx pop cx pop bx pop ax ret @@Error: xor ax, ax mov [di], ax stc pop es pop ds pop dx pop cx pop bx pop ax ret Str2Num ENDP Main PROC FAR mov ax, @DATA mov ds, ax mov es, ax ; ввод числа с клавиатуры (строки) lea dx, Prompt mov ah, 09h int 21h mov ah, 0Ah mov dx, offset KeyBuf int 21h ; перевод строки (на новую строку) lea dx, CR_LF mov ah, 09h int 21h ; преобразование строки в число lea si, KeyBuf+1 lea di, Numer call Str2Num ; проверка на ошибку jnc @@NoError ; если есть ошибка ввода - напечатать сообщение об ошибке lea dx, Error01 mov ah, 09h int 21h jmp @@Exit ; если нет ошибки ввода - загрузить число в регистр di @@NoError: mov di, Numer ; выход @@Exit: ; ожидание нажатия любой клавиши mov ah, 08h int 21h mov ax, 4c00h int 21h Main ENDP .STACK 100h END Main
Объяснение кода листинга программы
- Ввод строки цифр и преобразование её в число
- Ошибка ввода числа:
- Ошибка ввода (невозможно преобразовать введенные данные в число)
- Переменная
Numer
содержит результат преобразования строки в число - Переменная
Error01
содержит сообщение об ошибке
- Преобразование строки в число:
- Процедура
Str2Num
выполняет преобразование строки в число - Входные данные: ds:[si] - строка с числом, ds:[di] - адрес числа
- Выходные данные: ds:[di] - число, CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
- Цикл
@@Loop
выполняет преобразование каждого символа строки в число - При ошибке (если результат переноса установлен) выполняется переход к процедуре
@@Error
- При успешном преобразовании выполняется переход к следующей итерации цикла
- Процедура
- Ввод числа с клавиатуры (строки):
- Переменная
Prompt
содержит строкуВведите число:
- Переменная
CR_LF
содержит строку\r\n
(возврат каретки и перевод строки) - Переменная
KeyBuf
содержит строку, в которую вводится число - Выполняется ввод строки с помощью функции
int 21h
, ah=09h`
- Переменная
- Проверка на ошибку:
- Если ошибка ввода числа отсутствует (флаг
CY
равен 0), выполняется переход к процедуре@@NoError
- Если ошибка ввода числа присутствует (флаг
CY
установлен), выполняется вывод сообщения об ошибке с помощью функцииint 21h
, ah=09h`
- Если ошибка ввода числа отсутствует (флаг
- Выход:
- Выполняется ожидание нажатия любой клавиши с помощью функции
int 21h
, ah=08h` - Выполняется завершение работы программы с помощью функции
int 21h
, ah=4c00h`
- Выполняется ожидание нажатия любой клавиши с помощью функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д