
- •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. Операции с файлами: чтение и запись данных.
54. Отсортировать слова в строке (по длине слова, по алфавиту).
.model small;
.stack 100h;
.data;
i dw 0h
String db 'Enter a line: $'
Stg db 100h dup(0h); Массив для строки
.code;
mov ax, @data;
mov ds, ax;
mov ah, 00h; Очистка экрана
mov al, 2h;
int 10h
mov ah, 09h
Lea dx, String
int 21h
mov ah, 1h; Ф-я ввода символа
mov si, 0h
mov bx, 0h
Input: ;Ввод массива
int 21h
mov cx, si
mov Stg[bx], cl; Длина слова
cmp al, 32; Проверка на пробел
jne Skip1
mov si, 0h
add bx, 10h; Начало следующего слова
jmp Input
Skip1:
inc si
mov Stg[bx+si], al; Помещение символа в массив
cmp al, 13
jne Input
mov Stg[bx+si], 0h; Удаление Enter'а
mov i, bx; Кол-во слов
mov bx, 0h
Sort1: ;Выборочная сортировка
mov di, bx; Индекс минимальной длины
mov ax, bx
add ax, 10h
Sort2:
mov si, ax
mov cl, Stg[si]
cmp cl, Stg[di]
jae Skip2
mov di, si; Если меньше
Skip2:
add ax, 10h
cmp ax, i
jbe Sort2
mov si, 0h
Sort3:
moV cl, Stg[bx+si]; Смена слов
mov al, Stg[di]
mov Stg[bx+si], al
mov Stg[di], cl
inc si
inc di
cmp si, 10h
jb Sort3
add bx, 10h
cmp bx, i
jb Sort1
mov ah, 02h; Ф-я установки позиции курсора:
mov bh, 0h; № Страницы
mov dh, 2h; № строки
mov dl, 0h; № столбца
int 10h
mov bx, 0h
mov si, 0h
mov ah, 2h; Ф-я вывода символа
Output: ;Вывод массива
inc si
mov dx, word ptr Stg[bx+si]
cmp dx, 0h
jne Skip3
cmp bx, i
je Exit
mov si, 0h
add bx, 10h
mov dx, ' '
Skip3:
int 21h
cmp bx, i
jbe Output
Exit:
mov ah, 4ch;
int 21h
End
55. Удалить из строки заданное слово.
.MODEL small
.STACK 100h
.DATA
msg1 DB "Enter string: $"
msg2 DB 0Ah, 0Dh, "Enter substring to delete: $"
msg3 DB 0Ah, 0Dh, "Result: $"
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
call sub_search
inc si
loop all_string
call nextstr
;xor dx, dx
;mov dl, al
;add dl, 30h
;mov ah, 02h
;int 21h
lea dx, msg3
call strout
lea dx, str1
call strout
_end:
mov ah, 4ch ;канэц, просто канэц какой-та
int 21h
;*****************Процедуры***********************
nextstr proc
push dx
push ax
mov dl, 0Dh ;перевод на другую строку
mov ah, 02h
int 21h
mov dl, 0Ah
mov ah, 02h
int 21h
pop ax
pop dx
ret
nextstr endp
;*************************************************
strin proc
mov ah, 0Ah
int 21h
ret
strin endp
;*************************************************
strout proc
mov ah, 09h
int 21h
ret
strout endp
;*************************************************
sub_search proc
push cx
push di
push si
mov bx, si
mov cl, str2l
repe cmpsb
je _eq
jne _neq
_eq:
;di указывает на строку 2, si указывает на конец слова, которое надо удалить
call delete
inc al
_neq:
pop si
pop di
pop cx
ret
sub_search endp
;*************************************************
delete proc
push bx
push di
push si
mov di, bx ;в di - адрес начала удаляемого слова
xor cx, cx
mov cl, str1l
repe movsb
pop si
pop di
pop bx
ret
delete endp
end begin
.MODEL small
.STACK 100h
.DATA
msg1 DB "Enter string: $"
msg2 DB 0Ah, 0Dh, "Enter symbol: $"
msg3 DB 0Ah, 0Dh, "Result: $"
str1ml DB 200
str1l DB '$'
str1 DB 200 dup('$')
symbol DB ?
.CODE
begin:
mov ax, @data
mov ds, ax
mov es,ax
xor ax,ax
lea dx, msg1
call strout
lea dx, str1ml
call strin
lea dx, msg2
call strout
mov ah, 01h
int 21h
mov [symbol], al
xor cx, cx
mov cl, str1l
xor si, si
xor di, di
xor bx, bx
mov di, offset str1
mov si, offset str1
mov bl, [symbol]
cld
main_loop:
cmp [si], ' ' ;esli probel
je cont ;propuskaem
cmp [si], 13 ;esli konec
je end_main_loop ;vyvodim stroku
cmp [si], bl
jne cont ;esli ne sovpalo
in_loop:
inc si
cmp [si], ' ' ;esli probel
je stop ;stop
cmp [si], 13 ;esli konec
je stop ;stop
dec cx
jmp in_loop
stop:
call delete ;udalyaem
cont:
mov di, si
inc si
loop main_loop
end_main_loop:
lea dx, msg3
call strout
lea dx, str1
call strout
_end:
mov ah, 4ch ;vyhod
int 21h
;*****************Процедуры***********************
nextstr proc
push dx
push ax
mov dl, 0Dh
mov ah, 02h
int 21h
mov dl, 0Ah
mov ah, 02h
int 21h
pop ax
pop dx
ret
nextstr endp
;*************************************************
strin proc
mov ah, 0Ah
int 21h
ret
strin endp
;*************************************************
strout proc
mov ah, 09h
int 21h
ret
strout endp
;*************************************************
;v si - index nachala podstroki
;v di - index konca
delete proc
push bx
push di
push si
push cx
xor cx, cx
mov cl, str1l
repe movsb
pop cx
pop si
pop di
pop bx
ret
delete endp
end begin