- •Теоретичні відомості
- •1. Структура простої програми мовою асемблера. Формат кодування програми.
- •2. Основні директиви : segment , end, ends, proc, endp, assume.
- •3. Основні вимоги при створенні програми. Приклади простих програм мовою асемблера.
- •4. Трансляція програми. Опції компіляції та загальна характеристика.
- •6. Застосування програми налагодження для пошуку помилок.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •Теоретичні відомості
- •1. Директиви визначення даних.
- •2. Директива повторення dup.
- •3. Сталі.
- •5. Представлення в пам’яті цілих чисел.
- •6. Команда пересилки даних mov.
- •7. Команди двійкового додавання та віднімання.
- •Команда зміни знаку операнда neg
- •8. Обчислення цілих арифметичних виразів.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •1. Команда безумовного переходу jmp. Типи адресів переходу short,near та far.
- •2. Команди організації циклів ( loop,loopn,loopnz). Команда loop. Керування циклом за ecx/cx.
- •Керування циклом за ecx/cx із врахуванням ознаки zf
- •3. Команди умовних переходів.
- •5. Команда lea
- •Команда роботи зі стеком push та pop
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Логічні операції та операції зсувів.
- •2. Команди логічних операцій (and, test, or, xor, not).
- •3. Команди зсувів та циклічних зсувів.
- •Команди зсувів (sal, sar, shl,shr)
- •Команда зсуву логічного операнда вправо – shr
- •3.2 Команди циклічних зсувів (rol, ror ,rcl, rcr). Циклічний зсув операнда вліво - rol
- •Циклічний зсув операнда вправо ror
- •Циклічний зсув операнда вліво через ознаку переносу - rcl
- •Циклічний зсув операнда вправо через ознаку переносу – rcr
- •Бітові маски.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •1. Множення цілих чисел
- •2. Ділення цілих чисел
- •3. Перетворення в регістрах
- •Алгоритм введення–виведення цілих чисел
- •Виведення цілих чисел.
- •Введення цілих чисел.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •Особливості команд обробки рядків.
- •Ознака df. Команди зміни ознаки ( cld, std ).
- •Префікси повторення( rep, repe, repz, repne, repze ).
- •Команди обробки символьних рядків
Введення цілих чисел.
Введення цілих чисел складається з етапів:
введення символьного рядка;
перетворення символьного рядка у внутрішнє представлення.
На першому етапі за переривання DOS 21h або BIOS 10h здійснюємо введення символьного рядка у буфер, який завчасно резервуємо.
На другому етапі перетворюємо символ цифри у значення. З отримані значень за рекурентною послідовність(рекурентну послідовність опишемо на прикладі) отримуємо внутрішнє представлення. Перетворення можемо здійснити з будь–якої системи числення.
Для прикладу розглянемо алгоритм перетворення символьного представлення десяткового цілого числі з діапазону –32768 до 32767 у внутрішнє представлення розміром машинне слово. Результат перетворення запишемо регістр АХ.
Алгоритм
Очищаємо вміст регістр АХ.
Робимо активною першу позицію буфера введення.
В регістр СХ записуємо кількість введених символів у буфері.
Пропускаємо всі символи пробіли, переміщуючи активну позицію буфера та зменшуємо значення регістра СХ на одиницю. Перевіряємо чи буфер не порожній. Якщо буфер порожній перехід на пункт 12.
Якщо число від’ємне, тоді перший символ послідовності представлення числа знак мінус.
Перевіряємо на присутні знак мінус перед числом. Якщо так фіксуємо інформацію у комірці знаку та активною наступну позицію буфера.
Перевіряємо чи символ активної позиції буфера визначає знак цифри (від ‘0’до ‘9’). Якщо ні, повідомляємо про “помилку перетворення” та здійснюємо перехід на пункт 12.
Перетворюємо символ цифри у відповідне значення, тобто віднімаємо від значення символу цифри значення символ нуля (‘0’).
Множимо вміст регістр АХ на 10.
Додаємо отримане значення до вмісту регістра АХ.
Перевіряємо наявність наступної символу в буфері(перевірку здійснюємо вмістом регістра СХ ). Якщо символ є повертаємося на пункт 6.
Перевіряємо, чи число було від’ємне. Якщо від’ємне перевіряємо допустимий діапазон числа. Якщо діапазон допустимий число перетворюємо у від’ємне, в противному випадку видаємо інформацію про переповнення.
Кінець алгоритму.
Реалізація алгоритму.
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