Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
asm.doc
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
913.41 Кб
Скачать
    1. Введення цілих чисел.

Введення цілих чисел складається з етапів:

  • введення символьного рядка;

  • перетворення символьного рядка у внутрішнє представлення.

На першому етапі за переривання DOS 21h або BIOS 10h здійснюємо введення символьного рядка у буфер, який завчасно резервуємо.

На другому етапі перетворюємо символ цифри у значення. З отримані значень за рекурентною послідовність(рекурентну послідовність опишемо на прикладі) отримуємо внутрішнє представлення. Перетворення можемо здійснити з будь–якої системи числення.

Для прикладу розглянемо алгоритм перетворення символьного представлення десяткового цілого числі з діапазону –32768 до 32767 у внутрішнє представлення розміром машинне слово. Результат перетворення запишемо регістр АХ.

Алгоритм

  1. Очищаємо вміст регістр АХ.

  2. Робимо активною першу позицію буфера введення.

  3. В регістр СХ записуємо кількість введених символів у буфері.

  4. Пропускаємо всі символи пробіли, переміщуючи активну позицію буфера та зменшуємо значення регістра СХ на одиницю. Перевіряємо чи буфер не порожній. Якщо буфер порожній перехід на пункт 12.

Якщо число від’ємне, тоді перший символ послідовності представлення числа знак мінус.

  1. Перевіряємо на присутні знак мінус перед числом. Якщо так фіксуємо інформацію у комірці знаку та активною наступну позицію буфера.

  2. Перевіряємо чи символ активної позиції буфера визначає знак цифри (від ‘0’до ‘9’). Якщо ні, повідомляємо про “помилку перетворення” та здійснюємо перехід на пункт 12.

  3. Перетворюємо символ цифри у відповідне значення, тобто віднімаємо від значення символу цифри значення символ нуля (‘0’).

  4. Множимо вміст регістр АХ на 10.

  5. Додаємо отримане значення до вмісту регістра АХ.

  6. Перевіряємо наявність наступної символу в буфері(перевірку здійснюємо вмістом регістра СХ ). Якщо символ є повертаємося на пункт 6.

  7. Перевіряємо, чи число було від’ємне. Якщо від’ємне перевіряємо допустимий діапазон числа. Якщо діапазон допустимий число перетворюємо у від’ємне, в противному випадку видаємо інформацію про переповнення.

  8. Кінець алгоритму.

Реалізація алгоритму.

Data Segment

MAXELEM = 6

inputs label byte

maxs db MAXELEM

nums db ?

strs db MAXELEM dup(' ')

signed db 0 ; 1– signed, 1–unsigned

decimal dw ?

msgprpov db 'пеpeповнення','$'

msgnonn db 0dh,0ah,'немае цифpи','$'

Data Ends

Code segment

ASSUME CS : Code, DS : Data

; *******************

ininteger proc

push BX

push CX

push DX

push SI

push DI

push BP

mov BP,0ah

xor DI,DI

xor BX,BX

lea DX,inputs

mov AH,0ah

int 21h

xor DX,DX ; очистити pегiстp dx

xor AX,AX ;1) очистити pегiстp AX

lea SI,strs ;2)

dec SI

xor CX,CX ;3)

mov CL,nums ;3)

m1: inc SI

mov BL,[SI] ; 4)

cmp BL,' ' ; 4) Чи це пробiл?

jne m2 ; 4)пеpхiд, якщо не пpобiл

loop m1

jmp nonnum ; 4)-12) не було числа

m2: mov signed,0 ; signed=0 – плюс

cmp BL,'+' ;5)

je plus

cmp BL,'-' ;5)

jne nminus

mov signed,1 ;5) signed=1 - минус

plus: dec CX

peretv: inc SI

mov BL,[SI] ; 5)

nminus: ; 6) превiрка на цифру

cmp BL,'9'

ja numnot ; jamp if >'9'

sub BL,'0' ; 7)

jb numnot ; <'0'

inc DI ; цифра

mov AX,DX ; AX - попередне число

mul BP ; 8) ( AX)*10

jc perepov ; >FFFFh (dx<>0) -> переповнення

add AX,BX ;9)

jc perepov

mov BL,13

mov DX,AX ; число в dx

loop peretv ; 10) пеpехiд до наступного символу

numnot: mov AX,DX

cmp DI,0 ; не було цифри

je nonnum

cmp BL,' '

je num

cmp bl,13

je num

jmp nonnum

num: cmp signed,0 ; 11) число додатнe

je exit

cmp AX,8000h ; 11) модуль вiд'eмного числа > 8000h ?

ja perepov

neg AX ; 11) взяти з мiнусом

exit: mov decimal,AX

pop BP ; вихiд

pop DI

pop SI

pop DX

pop CX

pop BX

ret ; вихiд

perepov: lea DX,msgprpov ; переповнення

jmp error

nonnum: lea DX,msgnonn ; не було цифpи

error: mov AH,9

int 21h

mov AX,0ffffh

jmp exit

ininteger endp

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]