- •24. Ввод символа. Определить его позицию в строке и вывести на экран
- •Int 21h
- •30. Найти сумму элементов четных строк матрицы.
- •37. Перевод числа из одной системы счисления в другую. Данные вводить с клавиатуры.
- •Int 21h
- •42. Работа с окнами в текстовом режиме.
- •Inc si ;перейти к следующему элементу
- •Int 21h
- •59. Арифметические операции со знаковыми и беззнаковыми числами.
- •60. Процедуры в ассемблере, передача параметров, возврат значений.
- •61. Операции с файлами: создание, открытие, закрытие.
- •Int 21h ;открываем файл
- •Int 21h ;закрываем файл
- •62. Операции с файлами: чтение и запись данных.
- •Int 13h ;
- •Int 25h ;функция чтения секторов
Int 21h
end start
41.Вводится матрица чисел. Найти сумму элементов по каждой диагонали и вывести на экран.
.model small
.stack 300h
.code
endl macro
push ax dx
mov ah, 02h
mov dl, 0Ah
int 21h
mov dl, 0Dh
int 21h
pop dx ax
endm
outint macro value
local outint_l1, outint_l2
push ax bx cx dx
mov ax, value
mov bx, 10
xor cx, cx
outint_l1:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne outint_l1
mov ah, 02h
outint_l2:
pop dx
add dl, '0'
int 21h
loop outint_l2
pop dx cx bx ax
endm
proc readint
push cx si bx dx
mov [buf_str], 8
mov ah, 0Ah
lea dx, buf_str
int 21h
xor cx, cx
mov si, 2
xor ax, ax
mov bx, 10
in_loop:
mul bx
mov dl, [buf_str+si]
sub dl, '0'
add ax, dx
inc si
inc cl
cmp cl, [buf_str+1]
jl in_loop
pop dx bx si cx
endl
ret
endp
start:
mov ax, @data
mov ds, ax
xor cx, cx
xor dx, dx
xor di, di
input_loop:
push dx
mov ah, 09h
lea dx, str_1
int 21h
outint cx
lea dx, str_2
int 21h
mov si, sp
mov dx, [ss:si]
outint dx
lea dx, str_3
int 21h
call readint
mov word ptr matrix[di], ax
add di, 2
pop dx
inc cx
cmp cx, N
jl input_loop
xor cx, cx
inc dx
cmp dx, N
jl input_loop
xor si, si
xor ax, ax
count_sum1:
add ax, word ptr matrix[si]
add si, N*2+2
cmp si, N*N*2
jl count_sum1
mov sum1, ax
mov si, N*2-2
xor ax, ax
count_sum2:
add ax, word ptr matrix[si]
add si, N*2-2
cmp si, N*(N-1)*2+2
jl count_sum2
mov sum2, ax
mov ah, 09h
lea dx, str_4
int 21h
outint sum1
lea dx, str_5
int 21h
outint sum2
lea dx, str_6
int 21h
mov ax, 4C00h
int 21h
.data
N equ 3
matrix db N*N*2 dup(?)
buf_str db 10 dup(?)
str_1 db "Input matrix[$"
str_2 db "][$"
str_3 db "]:",10,13,"$"
str_4 db "Sum1=$"
str_5 db 10,13,"Sum2=$"
str_6 db 10,13,"$"
sum1 dw 0
sum2 dw 0
end start
42. Работа с окнами в текстовом режиме.
Работа с окнами в текстовом режиме. (результат работы проги: синее окно,
;в нем - зеленое окно, в зеленом окне - текст :))
.MODEL small
.STACK 100h
.DATA
str_ db 'TEXT'
len equ $-str_
.CODE
main:
mov ax, @data
mov ds, ax
mov es, ax
mov ah, 06h ;очистка окна
mov al, 00h ;режим окна
mov bh, 17h ;видео-атрибут для пустых строк
mov cx, 0000h ;очистка экрана от (00;00) до (24;79)
mov dx, 1b4fh
int 10h
mov ax, 0600h ;в ah - 06h в al - 00h
mov bh, 20h
mov cx, 0a1ch
mov dx, 0c31h
int 10h
mov ah, 13h ;вывод на экран в позиции курсора
mov al, 0 ;не менять положение курсора
mov bh, 0 ;номер страницы
mov bl, 07h ;цвет выводимого текста
mov cx, len
mov dx, 0b25h ;координаты на экране (dh - y, dl - x)
lea bp, str_ ;адрес выводимой строки
int 10h
mov ah, 4ch
int 21h
end main
43.Сложение и вычитание длинных чисел.
.model small
.stack 100h
.data
num1 dw 1234h, 5678h
num2 dw 8765h, 4321h
res1 dw 0,0
res2 dw 0,0
.code
start:
mov ax, @data
mov ds, ax
; сложение
mov ax, num1[0]
add ax, num2[0]
mov res1[0], ax
mov ax, num1[2]
adc ax, num2[2]
mov res1[2], ax
; вычитание
mov ax, num1[0]
sub ax, num2[0]
mov res2[0], ax
mov ax, num1[2]
sbb ax, num2[2]
mov res2[2], ax
mov ax, 4C00h
int 21h
end start
44. Вывести на экран ASCII символы по 16 символов с строке. Использовать прямой доступ к видеопамяти.
.model tiny
.code
.386 ;команды для 386 процессора
org 100h
start:
mov ax,003 ;установка 3 видео режима
int 10h ;очистка экрана
cld ; обработка строк в прямом порядке
mov eax,1F201F00h ;первый символ
mov bx, 0F20h ;
mov cx,255 ;количество символов
mov di, offset ctable ; буфер для записи кодов
cloop:
stosd
inc al
test cx, 0Fh ; кратно ли cx 16
jnz continue loop ; продолжение цикла
push cx
mov cx, 80-32 ; осталось мест в строке
xchg ax,bx
rep stows
xchg bx,ax
pop cx
continue_loop:
loop cloop
stosd ; регистров в адрес приёмника si,di
mov ax,0B800h ; вывод на экран
mov ex,ax ;устанавливаем на текст буфер
xor di,di ;es :di- буфер приёмника
mov si,offset ctable ; ds:si буфер
mov cx,15*80*32 ;количество выводимых слов
rep movsw ;пересылка
ret
ctable: end start
45. Передать строку из сегмента данных в сегмент кода.
.model small
.stack 100h
.data
STR_LEN equ 20
string1 db STR_LEN dup ('0')
db '$'
.code
start:
mov ax, @data
mov ds, ax
mov ax, cs
mov es, ax
mov si, offset string1
mov di, offset string2
mov cx, STR_LEN
cld
rep movsb
mov ax, 4c00h
int 21h
string2 db STR_LEN dup ('2')
db '$'
end start
46.Ввести массив символов, выделить из него числа и сложить их.
.model small
.stack 100h
.code
endl macro
mov ah, 02h
mov dl, 0Ah
int 21h
mov dl, 0Dh
int 21h
endm
start:
mov ax, @data
mov ds, ax
mov [buffer], 99
mov ah, 0Ah
int 21h
mov si, 2
xor ch, ch
mov cl, [buffer+1]
xor ax, ax
str_loop:
mov dl, [buffer+si]
cmp dl, '0'
jl not_int
cmp dl, '9'
jg not_int
xor dh, dh
sub dl, '0'
push dx
mov bx, 10
mul bx
pop dx
add ax, dx
jmp no_add
not_int:
cmp ax, 0
je no_add
add sum, ax
xor ax, ax
no_add:
inc si
loop str_loop
cmp ax, 0
je no_add_2
add sum, ax
no_add_2:
; out int sum
endl
mov ax,sum
mov bx, 10
xor cx, cx
cont_out:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne cont_out
mov ah, 02h
out_loop:
pop dx
add dl, '0'
int 21h
loop out_loop
endl
mov ax, 4C00h
int 21h
.data
buffer db 100 dup(?)
sum dw 0
end start
47. ввести 2 строки и сравнить их
.model small
.stack 100h
.data
msg1 db 0Ah,0Dh,"Enter first string",0Ah,0Dh,'$'
msg2 db 0Ah,0Dh,"Enter second string",0Ah,0Dh,'$'
msg4 db 0Ah,0Dh,"equal strings",0Ah,0Dh,'$'
msg5 db 0Ah,0Dh,"str1>str2",0Ah,0Dh,'$'
msg6 db 0Ah,0Dh,"str1<str2",0Ah,0Dh,'$'
str1 db 80 dup(0)
str2 db 80 dup(0)
.code
start:
push @data
pop ds
mov ah , 09h
mov dx,offset msg1
int 21h
xor si,si
xor di,di
mov cx,80
enter_str1:
mov ah,01h
int 21h
cmp al,0Dh
je continue_str2
mov str1[si],al
inc si
loop enter_str1
continue_str2:
mov cx,80
mov str1[si],'$'
mov ah,09h
lea dx,msg2
int 21h
xor di,di
enter_str2:
mov ah,01h
int 21h
cmp al,0Dh
je continue
mov str2[di],al
inc di
loop enter_str2
continue:
mov cx,80
mov str2[di],'$'
xor di,di
call my_proc
mov ah,09h
int 21h
mov ax,04C00h
int 21h
my_proc proc
xor di,di
comparable:
mov al,str1[di]
cmp al,str2[di]
jl large_str2
jg large_str1
inc di
loop comparable
lea dx,msg4
ret
large_str1:
lea dx,msg5
ret
large_str2:
mov ah,09h
lea dx,msg6
ret
my_proc endp
end start
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. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.
.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 ;собственно сам конец проги
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
56 Удал из строки слова символом
.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
58. В массиве подсчитать число элементов, лежащих в заданном диапазоне.
.model small
.stack 100h
.data
left db 0h
right db 0h
count db 0h
mas_num = 5; number of element in mass
mass db mas_num dup(?)
outbuf db 4 dup(?),'$'
inbuf db 3,0,3 dup(?),'$'
ent db 0ah,0dh,'$'
massInput db "Input 30 elements if array - ", 0dh, 0ah, '$'
limInput db "Input limints - ", 0dh, 0ah, '$'
doneMess db "Done! Count - ", 0dh, 0ah, '$'
mesError db 0ah,0dh,'Number transormation error!',0ah,0dh,'$'
.code
printNum proc ;Вывод числа, размер числа байт
push ax ;поместить используемые регистры в стек
push bx
push si
push cx
;заполнить буфер пробелами
mov cx,4 ;количество элементов в буфере
mov si,offset outbuf;адрес буфера
space:
mov byte ptr [si],' ' ;записать пробел