Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
base.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
494.08 Кб
Скачать

Ввести рядок і слово. Перевірити, чи слово входить у рядок. Знайти позицію входження. (трошки не працює).

.8086

.model small

.stack 100h

.data

MaxLen equ 200

String db MaxLen dup(?)

Slovo db 'in '

lenS = $-Slovo

msg1 db 'There is no word "in" in the string!','$'

msg2 db 'There is word "in" in the string.','$'

msg3 db "It's position is: ",'$'

msg4 db 'Input string: ','$'

Position dw ?

.code

.startup

mov ax,@data

mov ds,ax

mov ah,9h ;номер функції виведення даних

lea dx,msg4 ;адреса повідомлення, яке буде виводитись

int 21h ;виведення на екран повідомлення msg1

mov ah,3fh ;номер функції DOS введення даних

mov bx,0 ;дескриптор клавіатури

mov cx,MaxLen ;максимальна кількість символів

lea dx,String ;адреса рядка для виведення

int 21h ;ввести рядок

and ax,ax ;чи введено будь-які символи?

jz Done ;ні, перехід на кінець програми

mov cx,lenS ;записати кількість введених символів в регістр СХ

push cx ;запам'ятати регістр СХ у стеку

push ds ;занесення ds у стек

pop es ;вилучення зі стеку es

cld ;опрацювання ряка зліва направо

lea si,String ;занесення в si адресу введеного рядка

lea di,Slovo ;занесення в di адресу слова "in"

m1: ;перевірка слів у стрічці

repne cmpsw ;повторювати перевірку слова

je m2 ;якщо це слово "in", то перехід на m2

jne m3 ;інакше на m3

m2: ;якщо слово у рядку співпало з шуканим словом

inc si ;збільшити si

mov Position,si ;занести значення si у змінну Position

mov ah,9h ;номер функції виведення даних

lea dx,msg2 ;адреса повідомлення, яке буде виводитись

int 21h ;виведення на екран повідомлення msg1

jmp Done ;перехід на кінець програми

m3: ;якщо пеше слово стрічки не збіглось із шуканим

pop cx ;вилучення зі стеку значення сх

cmp si,ax ;порівняння поточної позиції у стрічці із її загальгою довжиною

lea di,Slovo ;занести в di адресу слова, яке шукається

lea si,String+3 ;занесення в si наступного слова стрічки

jl m1 ;якщо поточна позиція в стрічці менша за її довжину

mov Position,0 ;якщо не знайдено заданого слова у стрічці,

;то заносимо у значення позиції нуль

mov ah,9h ;номер функції виведення даних

lea dx,msg1 ;адреса повідомлення, яке буде виводитись

int 21h ;виведення на екран повідомлення msg1push ds

jmp Done ;перехід на кінець програми

Done: ;кінець програми

mov ah,4ch ;номер функції DOS для завершення програми

int 21h ;завершити програму та вийти у DOS

END ;кінець програми

Використовуючи логічні операції виконати швидке ділення цілого числа X на 10.

.model small

.stack 100h

.data

a dw 65

res db ?

zal db ?

.code

.startup

mov al,2

mov bl,2

shl al,2 ;зміщення розрядів числа вліво на 2

add ax,bx ;формування числа 10

mov bx,ax ;перенесення 10 в регістр BX

mov ax,a ;занесення в АХ діленого

div bl ;ділення на 10

mov res,al ;результати

mov zal,ah

.exit 0

End

Ввести речення і два слова. У реченні виконати заміну одного слова на інше.

.model small

.stack 100h

.data

str1 db "abcdabegabd",'$' ;рядок

len1 = $-str1 ;довжина рядка

str2 db "ab",0 ;перше слово

str3 db "mn",0 ;друге слово

.code

.startup

push ds

pop es

cld ;очищення прапорця DF

lea dx,str1 ;зміщення стрічки заноситься в регістр DX

mov di,offset str1

mov ax,word ptr str2 ;заношу в АХ перше слово

mov cx,len1 ;цикл буде повторюватись на всю довжину речення

m1:scasw ;порівняння слова в AX, зі словом за адресою ES:DI

ja m2 ;якщо більше – на мітку м2

jb m2 ;якщо менше – на мітку м2

sub di,2 ;повертаємось на два символи назад

mov word ptr [di], 'mn' ;заміна одного слова на інше

add di,2 ;на два символи вперед

m2: ;мітка м2

loop m1 ;закінчення циклу

mov ah,9h

lea dx,str1

int 21h ;виведення на екран рядка

.exit 0

end

Переводить задане число з неупакованого BCD формату в ASCII формат

.8086

.model small

.stack 100h

.data

n=3

a db 1, 4, 7 ;number in unpacked BCD format = 147

res db n dup(0) ;massif (place) where will be recorded number in ASCII formar

.code

.startup

xor si,si ;clear registers that will be used

xor cx,cx

xor ax,ax

mov cx,3

m1: mov ah,a[si];a[si]->ah

OR ah,30h ;to get ASCII code we will use logical OR with 30h

mov res[si],ah ;ah->a[si] In a[si] we have ASCII code of [si] digit

inc si ;go to next digit

loop m1

.exit 0

end @startup ;end of program

Визначає чи заданий рядок символів є буквеним чи цифровим.

.8086

.model small

.stack 100h

Print Macro msg ;function of outputting messages

mov ah,9h ;ah<-number of function

lea dx,msg

int 21h ;number of interruption

Endm

.data

line db "red1223" ;incoming line of symbols

long=$-line ;define it's length

cdigits db 0 ;amount of digits

cletters db 0 ;amount of letters

msg1 db "It is English word",'$';messages that can be printed

msg2 db "It is digital word",'$'

msg3 db "It is neither English nor digital word",'$'

.code

.startup

xor si,si ;clear registers

xor cx,cx

mov cx,long ;cycle will repeat for <lenth of word> times

m1:xor ax,ax

mov al,line[si];al<-current symbol

cmp al,48

jl m2 ;if al<(ASCII '0')

cmp al,58

jl m3 ;if al<(ASCII '9'+1)

cmp al,65

jl m2 ;if al<(ASCII 'A')

cmp al, 91

jl m4 ;if al<(ASCII 'Z'+1)

cmp al,97

jl m2 ;if al<(ASCII 'a')

cmp al, 123

jl m4 ;if al<(ASCII 'z'+1)

jmp m2 ;else

m4:add cletters,1 ;amount of English letters +1

add si,1 ;go to next element of line

loop m1

xor bl,bl ;if it was last element

mov bl,cletters

cmp bl,long ;compare amount of letters with length of line

jne m2 ;if it is not equal

Print msg1

jmp m5

m3:add cdigits,1 ;amount of digits +1

add si,1

loop m1

xor bl,bl ;if it was last element

mov bl,cdigits

cmp bl,long ;compare amount of digits with length of line

jne m2 ;if it is not equal

Print msg2

jmp m5

m2:Print msg3

m5:

.exit 0

end @startup ;end of program

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