[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

Объяснение кода листинга программы

  1. Ввод строки цифр и преобразование её в число
  2. Ошибка ввода числа:
    • Ошибка ввода (невозможно преобразовать введенные данные в число)
    • Переменная Numer содержит результат преобразования строки в число
    • Переменная Error01 содержит сообщение об ошибке
  3. Преобразование строки в число:
    • Процедура Str2Num выполняет преобразование строки в число
    • Входные данные: ds:[si] - строка с числом, ds:[di] - адрес числа
    • Выходные данные: ds:[di] - число, CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
    • Цикл @@Loop выполняет преобразование каждого символа строки в число
    • При ошибке (если результат переноса установлен) выполняется переход к процедуре @@Error
    • При успешном преобразовании выполняется переход к следующей итерации цикла
  4. Ввод числа с клавиатуры (строки):
    • Переменная Prompt содержит строку Введите число:
    • Переменная CR_LF содержит строку \r\n (возврат каретки и перевод строки)
    • Переменная KeyBuf содержит строку, в которую вводится число
    • Выполняется ввод строки с помощью функции int 21h, ah=09h`
  5. Проверка на ошибку:
    • Если ошибка ввода числа отсутствует (флаг CY равен 0), выполняется переход к процедуре @@NoError
    • Если ошибка ввода числа присутствует (флаг CY установлен), выполняется вывод сообщения об ошибке с помощью функции int 21h, ah=09h`
  6. Выход:
    • Выполняется ожидание нажатия любой клавиши с помощью функции int 21h, ah=08h`
    • Выполняется завершение работы программы с помощью функции int 21h, ah=4c00h`

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.5 из 5
Похожие ответы