
- •5. Использование логических и сдвиговых операций.
- •6. Стандартные директивы определения сегментов.
- •7. Упрощенные директивы определения сегментов.
- •8. Организация и использование стека.
- •9. Структура программ типа .Com и .Exe.
- •10. Организация обслуживания прерываний. Типы прерываний. Таблица векторов прерываний.
- •11. Подпрограммы. Передача параметров. Ближние и дальние процедуры.
- •12. Повторяющиеся блоки и макросы.
- •13. Вывод информации на экран. Видеорежимы. Видеопамять
- •14. Строковые команды. Префиксы повторения.
- •15. Организация циклов, условных и безусловных переходов
- •16. Мультимодульные программы.
- •17. Обработчики прерываний и резидентные программы.
- •19. Интерфейс модулей, написанных на языке ассемблера с модулями, написанными на языке с.
- •20. Вызов из программы, написанной на языке с , процедур, написанных на ассемблере.
- •21. Вызов из ассемблерной программы функций на языке с.
- •22. Использование встроенного ассемблера.
- •26. Обработка переполнения при делении чисел. Числа ввести с клавиатуры
- •32. В сегменте данных расположены числа в формате двойного слова. С клавиатуры вводится число и определяется, имеется ли это число в сегменте данных.
- •35. Ввести с клавиатуры массив чисел. Найти суммы положительных и отрицательных чисел. Вывести результат.
- •42. Работа с окнами в текстовом режиме.
- •52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.
- •53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.
- •54. Отсортировать слова в строке (по длине слова, по алфавиту).
- •55. Удалить из строки заданное слово.
- •58. В массиве подсчитать число элементов, лежащих в заданном диапазоне.
- •59. Арифметические операции со знаковыми и беззнаковыми числами.
- •60. Процедуры в ассемблере, передача параметров, возврат значений.
- •61. Операции с файлами: создание, открытие, закрытие.
- •62. Операции с файлами: чтение и запись данных.
52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.
.MODEL small
.STACK 100h
.DATA
msg1 DB "Enter string: $"
msg2 DB 0Ah, 0Dh, "Enter substring to find: $"
msg3 DB 0Ah, 0Dh, "Yes!$"
msg4 DB 0Ah, 0Dh, "No such substring:($"
str1ml DB 200
str1l DB '$'
str1 DB 200 dup('$')
str2ml DB 200
str2l DB '$'
str2 DB 200 dup('$')
.CODE
begin:
mov ax, @data
mov ds, ax
mov es,ax
xor ax,ax
lea dx, msg1 ;вывод приглашения msg1
call strout
lea dx, str1ml ;ввод строки str1
call strin
lea dx, msg2 ;вывод приглашения msg2
call strout
lea dx, str2ml ;ввод строки str2
call strin
xor cx, cx
mov cl, str1l ;устанавливается кол-во повторений
sub cl, str2l
inc cl
cld ;обход вперёд
lea di, str2 ;в di - строка, которую надо найти
lea si, str1 ;в si - строка, в которой ищем
xor ax, ax
all_string: ;повторяется для str1 до конца строки минус длина str2
push cx
push di
push si
mov bx, si
mov cl, str2l
repe cmpsb
je _eq
jne _neq
_eq:
lea dx, msg3 ;вывод приглашения msg1
call strout
jmp _end
;inc al
_neq:
pop si
pop di
pop cx
inc si
loop all_string
lea dx, msg4
call strout
_end:
mov ah, 4ch ;канэц, просто канэц какой-та
int 21h
;*****************Процедуры***********************
;*************************************************
strin proc
mov ah, 0Ah
int 21h
ret
strin endp
;*************************************************
strout proc
mov ah, 09h
int 21h
ret
strout endp
;*************************************************
end begin
53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.
; reverse string
name "reverse"
org 100h
jmp start
string1 db 255 dup('$')
newstr db 0ah, 0dh, '$'
instr db "enter string:",0Dh,0Ah,'$'
start: mov dx,offset instr ;instruction
mov ah,09h
int 21h
mov bx,offset string1 ;vvod
mov [bx],255
mov dx, bx
mov ah,0Ah
int 21h
add bl, string1[1]
add bx, 2
mov [bx],'$'
xor dx,dx
xor ax,ax
lea bx, string1
add bx, 2
mov si, bx
mov di, bx
dec si
next_byte: inc si ;prohod po stroke
mov al,[si]
cmp al,' '
je found_the_end
mov al, [si]
cmp al,'$'
je found_the_end
jmp next_byte
found_the_end: mov dx,si ;naiden probel ili $
dec si
mov bx, di
do_reverse: cmp bx, si ;inversia slova
jae done
mov al, [bx]
mov ah, [si]
mov [si], al
mov [bx], ah
inc bx
dec si
jmp do_reverse
done: mov si,dx ;rezult
inc dx
mov bx,dx
mov di,bx
mov al,[si]
mov dx, offset newstr
mov ah, 09h
int 21h
mov dx,offset string1
add dx,2
mov ah, 09h
int 21h
mov ah,[si]
cmp ah,'$'
jne next_byte
mov ah, 0
int 16h
ret
.model small ;размер блока памяти (тут для ехе-программы)
.stack 100h ;для данных и стека
.data ;сегмент данных
msg1 db 0Ah,0Dh,"Enter string :",0Ah,0Dh,'$'
string db 80 dup(?) ;неинециализированная переменная
msg2 db 0Ah,0Dh,"Reversed string:",0Ah,0Dh,'$'
.code ;сегмент кода
start: ;начало куска старт
mov ax,@data ;адрес начала сегмента данных
mov ds,ax ;
lea dx,msg1
mov ah,09h
int 21h ;вызов дос-прерывания
vvod:
mov ah,01h
int 21h
cmp al,0Dh ;сравнение
je body ;и если символ равен вводу, то дальнейшее перенаправление
mov string[si],al ;заносим символы в строку
inc si ;si++
loop vvod ;повторять блок vvod
body:
mov ah,09h
lea dx,msg2 ;копирование адресса
int 21h ;вывод текста оформления
cmp si,0
je exit
mov di,si ;создание третьего счётчика(si - второй, cx - конечно первый, но он тут неиспользуется ввиду того что он начинает изменяться в любом цикле, а тут алгоритм сложнее
revers: ;функция для перемещения по строке
dec si ;si--
mov bp,si
cmp string[si], ' ' ;сравнение для нахождения пробела между словами
je funk
cmp si,0 ;проверка второго счётчика на конец строки
je funk3
loop revers
mov dl,string[0] ;допись последнего символа
mov ah,02h
int 21h
funk: ;функция для вывода слова
inc bp
mov dl,string[bp]
mov ah,02h
int 21h
cmp bp,di
je funk2
loop funk
funk2: ;функция для изменения di и дальнейшего направления в revers
mov di,si
je revers
funk3: ;функция для вывода первого слова перед которым нет пробела
mov dl,string[bp]
mov ah,02h
int 21h
cmp bp,di
je exit
inc bp
loop funk3
exit:
mov ah,4Ch ;копирование для конца проги
int 21h ;вызов дос-прерывания
end start ;собственно сам конец проги