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

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],' ' ;записать пробел

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