ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Вывести на экран 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

Передать строку из сегмента данных в сегмент кода.

.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

Ввести массив символов, выделить из него числа и сложить их.

.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

Ввести 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

Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.

.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"

rg 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 ;собственно сам конец проги

Отсортировать слова в строке (по длине слова, по алфавиту).

.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

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти