Запись числа прописью - Assembler
Формулировка задачи:
Перевод числа из десятичной формы (<255) в прописную
Написать программу, которая вводит и и записывает(выводит)однобайтовое целое число без знака прописью, например 128 = сто двадцать восемь. Был бы рад любой помощи, он полной до частичной, а иначе меня ждет призыв летний в армию. Думаю разницы нет, но компилировать могу в FASM. И EMY8086.
Решение задачи: «Запись числа прописью»
textual
Листинг программы
LOCALS .model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' _100 db 'сто', '$' _200 db 'двести', '$' _20 db 'двадцать', '$' _30 db 'тридцать', '$' _40 db 'сорок', '$' _50 db 'пятьдесят', '$' _60 db 'шестьдесят', '$' _70 db 'семьдесят', '$' _80 db 'восемьдесят', '$' _90 db 'девяносто', '$' _10 db 'десять', '$' _11 db 'одиннадцать', '$' _12 db 'двенадцать', '$' _13 db 'тринадцать', '$' _14 db 'четырнадцать', '$' _15 db 'пятнадцать', '$' _16 db 'шестнадцать', '$' _17 db 'семнадцать', '$' _18 db 'восемнадцать', '$' _19 db 'девятнадцать', '$' _0 db 'ноль', '$' _1 db 'один', '$' _2 db 'два', '$' _3 db 'три', '$' _4 db 'четыре', '$' _5 db 'пять', '$' _6 db 'шесть', '$' _7 db 'семь', '$' _8 db 'восемь', '$' _9 db 'девять', '$' hundreds label dw offset _100 dw offset _200 dozens2 label dw offset _20 dw offset _30 dw offset _40 dw offset _50 dw offset _60 dw offset _70 dw offset _80 dw offset _90 dozens1 label dw offset _10 dw offset _11 dw offset _12 dw offset _13 dw offset _14 dw offset _15 dw offset _16 dw offset _17 dw offset _18 dw offset _19 units label dw offset _0 dw offset _1 dw offset _2 dw offset _3 dw offset _4 dw offset _5 dw offset _6 dw offset _7 dw offset _8 dw offset _9 N db 0 kbdBuf db 4, 0, 4 dup(0) Prompt db 'Input number: ', '$' .code main proc mov ax, @data mov ds, ax ;ввод числа в виде строки mov ah, 09h lea dx, Prompt int 21h mov ah, 0Ah lea dx, kbdBuf int 21h mov ah, 09h lea dx, CrLf int 21h ;преобразования строки в число lea si, kbdBuf+1 call StrToUInt8 mov N, al ;получение числа прописью mov ax, 0 mov al, N mov ch, 1 ;число равно нулю @@Hundreds: mov cl, 100 div cl cmp al, 0 je @@Dozens mov ch, 0 ;не нужно выводить "ноль" lea si, Hundreds mov bx, 0 mov bl, al dec bx add bx, bx mov dx, [si+bx] push ax mov ah, 09h int 21h mov ah, 02h mov dl, ' ' int 21h pop ax @@Dozens: cmp ah, 20 jae @@Dozens2 cmp ah, 10 jb @@Dozens2 lea si, Dozens1 mov bx, 0 mov bl, ah sub bx, 10 add bx, bx mov dx, [si+bx] push ax mov ah, 09h int 21h mov ah, 02h mov dl, ' ' int 21h pop ax jmp @@Exit @@Dozens2: mov al, ah mov ah, 0 mov cl, 10 div cl cmp al, 0 je @@Units mov ch, 0 lea si, Dozens2 mov bx, 0 mov bl, al sub bx, 2 add bx, bx mov dx, [si+bx] push ax mov ah, 09h int 21h mov ah, 02h mov dl, ' ' int 21h pop ax @@Units: ;требуется выводить ноль? or ch, ah jz @@Exit lea si, Units mov bx, 0 mov bl, ah add bx, bx mov dx, [si+bx] push ax mov ah, 09h int 21h pop ax @@Exit: mov ax, 4C00h int 21h main endp ;Преобразование строки Pascal типа в беззнаковое число размером 1 байт ;на входе: ; ds:si - указатель на строку Pascal типа ;на выходе: ; al - считанное число ; ah=0 StrToUInt8 proc push bx push cx push dx push si push di mov ax, 0 ;итоговое число mov cx, 0 ;количество символов в строке mov cl, [si] mov bx, 10 ;множитель inc si ;si - теперь указывает на символьный массив jcxz @@Exit @@For: mul bl ;ax=al*10 cmp ah, 0 ; проверяем, результат на переполнение jne @@Error mov di, ax ;сохраняем промежуточный результат mov al, [si] ; Преобразуем следующий символ в число ;проверка, что символ - цифра cmp al, '0' jb @@Error cmp al, '9' ja @@Error ;преобразование символа цифры в число sub al, '0' add ax, di ; cmp ah, 0 ; проверяем, результат на переполнение jne @@Error inc si loop @@For clc ;нет ошибки jmp @@Exit @@Error: mov ax, 0 stc ;признак ошибки @@Exit: pop di pop si pop dx pop cx pop bx ret StrToUInt8 endp end main
Объяснение кода листинга программы
- Создание переменных:
CrLf
- байтовая последовательность для перевода строки в консоли_100
,_200
,_20
,_30
,_40
,_50
,_60
,_70
,_80
,_90
,_10
,_11
,_12
,_13
,_14
,_15
,_16
,_17
,_18
,_19
,_0
,_1
,_2
,_3
,_4
,_5
,_6
,_7
,_8
,_9
- строковые переменные, содержащие числительныеhundreds
,dozens2
,dozens1
,units
- меткиN
- байтовая переменная для хранения числаkbdBuf
- массив байтов для ввода числа в виде строкиPrompt
- строка для приглашения ввести число
- Ввод числа:
- Вывод приглашения ввести число
- Считывание числа в виде строки
- Преобразование строки в число
- Преобразование числа в числительное:
- Определение сотен, десятков и единиц в числе и вывод их названий в консоль
- Обработка ошибок и завершение программы. *примечание: указанный код написан на ассемблере, который приближен к x86 Assembly.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д