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