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

Int 21h ;выводим на экран

mov ax,N ;размер матрицы

mul N ;количество элементов в матрице

mov cx,ax ;количество элементов в матрице

lea bx,A ;начало матрицы

mo6: mov ax,[bx] ;берем элемент матрицы

call printdec ;выводим

mov ah,2 ;функция вывода символа на экран

mov dl,9 ;символ табуляции

int 21h ;выводим пробел

add bx,2 ;переходим к следующему элементу матрицы

dec cx ;уменьшаем количество оставшихся элементов

jz ex1 ;если 0 - закончить

mov ax,cx ;количество оставшихся элементов

mov dx,N ;длина строки матрицы

div dl ;делим текущий элемент на длину строки матрицы

test ah,ah ;если не 0

jnz mo6 ;то продолжить

mov ah,2 ;функция вывода символа на экран

mov dl,13 ;возврат каретки

int 21h ;выводим возврат каретки

mov dl,10 ;перевод строки

int 21h ;выводим перевод строки

jmp mo6 ;продолжаем вывод

ex1: ret

outmatrix endp

str2dw proc

;Преобразование строки в число

;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать

; на выходе в ax - число.

push bx ;сохраняем регистры

push dx

push si

xor bx,bx

xor dx,dx ;сумма

@lp1: xor ax,ax

lodsb ;берем чимвол

cmp al,13 ;если это конец строки,

jz @ex ;то заканчиваем

cmp al,'-' ;если минус,

jnz @m1

mov bx,1 ;то устанавливаем признак минуса

jmp @lp1 ;продолжаем обработку

@m1: cmp al,'9' ;если это не цифра,

jnbe @lp1 ;то пропускаем

cmp al,'0' ;если это не цифра,

jb @lp1 ;то пропускаем

sub ax,'0' ;получаем цифровое значение

shl dx,1 ;умножаем сумму на 10

add ax, dx

shl dx, 2

add dx, ax ;прибавляем текущее значение

jmp @lp1 ;продолжаем обработку

@ex: test bx,bx ;если установлен признак отрицательного числа

jz @ex1

neg dx ;то меняем знак

@ex1: mov ax,dx ;помещаем результат в ах

pop si

pop dx

pop bx

ret ;выход из подпрограммы

str2dw endp

;преобразование числа из ах в десятичную строку и вывод на экран

;ax - число

printdec proc

push cx ;сохраняем регистры

push dx

push bx

push si

mov si,ax ;запоминаем число

mov bx,10 ;основание системы

xor cx,cx ;в сх будет количество цифр в десятичном числе

test ax,ax ;если число положительное

jns @@m1a ;то пропускаем

neg ax ;если отрицательное, то меняем знак

@@m1a: xor dx,dx

div bx ;делим число на степени 10

push dx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек

inc cx ;увеличиваем количество десятичных цифр числа

test ax,ax ;после деления остался 0?

jnz @@m1a ;если нет, продолжаем

test si,si ;число отрицательное?

jns @@m3a ;если нет, пропустить

push -3 ;иначе дописать перех числом минус

inc cx ;увеличить количество цифр числа

@@m3a: mov ah,2 ;ф-я вывода символа

@@m2a: pop dx ;взять из стека цифру цисла

add dl,'0' ;преобразовываем цифру в ASCII символ

int 21h ;вывести на экран

loop @@m2a ;все цифры

pop si ;восстанавливаем регистры

pop bx

pop dx

pop cx

ret ;выход из подпрограммы

printdec endp

end start

22.Написать программу на языке Ассемблер с функцией, которая преобразует целое без знака в его восьмеричное символьное представление. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

n dd 0

res db 32 dup (0)

s11 db 'Input positive integer: ',0

s2 db 'Result: %s',0

fmt1 db '%s',0

fmt2 db '%d',0

char dd 0

.code

_start:

invoke crt_printf,offset s11

invoke crt_scanf,offset fmt2,offset n

mov eax, n

lea edi,res

call printoct

invoke crt_printf,offset s2,offset res

ex: invoke crt_scanf,offset fmt1,offset res

ret

;преобразование числа из ах в десятичную строку по адресу es:di

;axe - число

;edi - адрес буфера приемника

printoct proc

mov ebx,8 ;основание системы счисления

xor ecx,ecx ;в сх будет количество цифр в десятичном числе

@@m1a: xor edx,edx ;очистить старшую часть делимого

div ebx ;делим число на степени 8

push edx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек

inc ecx ;увеличиваем количество десятичных цифр числа

test eax,eax ;после делия остался 0?

jnz @@m1a ;если нет, продолжаем

@@m2a: pop eax ;взять из стека цифру цисла

add al,'0' ;преобразовываем цифру в ASCII символ

stosb ;сохраняем в буфер

loop @@m2a ;все цифры

mov al,0

stosb ;добавить признак конца строки

ret ;выход из подпрограммы

printoct endp

end _start

end

23.Написать программу на языке Ассемблер с функцией, которая определяет, есть ли во введённом тексте слова, начинающиеся с буквы А, и сколько таких слов.

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

s db 256 dup (0)

s1 db 'Input string: ',0

s2 db 'Result: %d',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_gets,offset s

lea esi,s

call count

invoke crt_printf,offset s2,eax

ex: invoke crt_scanf,offset fmt1,offset s

ret

;подсчет слов в тексте, начинающихся с А

;esi - адрес строки

;возвращает: eax - кол-во слов на А

count proc

;поиск начала слова

xor edx,edx ;кол-во найденных слов

lp2:

lodsb ;взять очередной символ

cmp al,0 ;если конец строки

jz fin ;то закончить подсчет

cmp al,' ' ;если пробел,

jz lp2 ;продолжить поиск

cmp al,'A' ;если первая буква слова А

jz fa ;увеличить кол-во слов

cmp al,'a' ;если не а

jnz lp1 ;то пропустить

fa: inc edx ;начало слова найдено, увеличить кол-во найденных слов

;поиск конца слова

lp1:

lodsb ;взять очередной символ

cmp al,0 ;если конец строки

jz fin ;то закончить подсчет

cmp al,' ' ;если не пробел,

jnz lp1 ;то продолжить поиск

;конец слова найден

jmp lp2 ;опять искать начало слова

fin:

mov eax,edx ;вернуть кол-во слов,начинающихся с А

ret

count endp

end _start

end

24.Написать программу на языке Ассемблер с функцией, которая определяет, входит ли каждая буква в заданную строку не более двух раз. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

s db 256 dup (0)

s1 db 'Input string: ',0

s2 db 'Yes',0

s3 db 'No',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_gets,offset s

lea esi,s

call check

test eax,eax

jz no

invoke crt_printf,offset s2

jmp ex

no: invoke crt_printf,offset s3

ex: invoke crt_scanf,offset fmt1,offset s

ret

;esi - строка

;возвращает: eax - 1 - да, 0 - нет

check proc

mov edi,esi ;запомнить начало строки

lp1:

lodsb ;прочитать очередной символ

cmp al,0 ;если конец строки

jz fin ;то закончить

xor ecx,ecx ;кол-во вхождений данного символа в строке

mov ebx,edi ;начало строки

lp2:

mov ah,[ebx] ;взять очередной символ

cmp ah,0 ;если конец строки

jz f1 ;то закончить

cmp ah,al ;если не проверямый символ

jnz m1 ;то пропустить

inc ecx ;увеличить кол-во вхождений очередного символа

m1: inc ebx ;следующий символ

jmp lp2 ;подсчитать кол-во вхождений одного символа

f1: cmp ecx,2 ;если не более 2х вхождений

jna lp1 ;то продолжить

xor eax,eax ;иначе условие не выполняется

ret

fin:

mov eax,1 ;условие задания выполняеися

ret

fin2:

check endp

end _start

end

25.Написать программу на языке Ассемблер с функцией, которая для переданного ей в качестве аргумента натурального числа N определяет сумму цифр числа, находящихся на чётных позициях (старшая цифра находится на первой позиции).

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

n dd 0

s1 db 'N: ',0

str1 db 'numdigits = %d',0

fmt0 db '%d',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_scanf,offset fmt0,offset n

mov eax,n

call digits ;определить сумму цифр на четных местах

invoke crt_printf,offset str1,eax

ex: invoke crt_scanf,offset fmt1,offset str1 ;Пауза перед закрытием программы

ret

;определение кол-ва и суммы цифр числа

;eax - число

;eax - сумма цифр числа, чтоящих на четном месте

digits proc

mov ebx,10 ;основание системы

xor ecx,ecx ;кол-во цифр в числе

@@m1a: xor edx,edx ;очистить старшую часть делимого

div ebx ;делим число на степени 10

push edx ;сохранить остаток от деления

inc ecx ;увеличить кол-во цифр в числе

test eax,eax ;после деления остался 0?

jnz @@m1a ;если нет, продолжаем

xor eax,eax ;сумма цифр числа

mov ebx,1 ;номер текущей цифры

m2: pop edx ;восстановить очередной остарок от деления

test ebx,1 ;проверить номер цифры на четность

jnz m3 ;если нечетный - пропустить

add eax,edx ;если четный - прибавить к сумме

m3: inc ebx ;увеличить номер цифры

loop m2 ;порсуммировать все

ret

digits endp

end _start

end

26.Написать программу на языке Ассемблер с функцией, которая определяет, являются ли симметричными в заданной квадратной матрице главная и побочная диагонали. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.586

.model flat,stdcall

option casemap:none

input_matrix proto matr:dword, inmsg:dword

include msvcrt.inc

includelib msvcrt.lib

.data

A dd 100 dup (0)

n dd 0

s2 db 'N: ',0

str1 db 'A(%d)(%d) = ',0

s3 db 'A: ',13,10,0

fmt0 db '%d',0

fmt2 db '%d',9,0

fmt1 db '%s',0

crlf db 13,10,0

msg1 db 'Input matrix A',13,10,0

msg2 db 13,10,'Yes',0

msg3 db 13,10,'No',0

.code

_start:

invoke crt_printf,offset s2

invoke crt_scanf,offset fmt0,offset n

invoke crt_printf,offset msg1

invoke input_matrix,offset A,offset str1

invoke crt_printf,offset s3

mov ebx,offset A

call out_matrix

lea esi,A

mov ecx,n

call check

test eax,eax

jz no

invoke crt_printf,offset msg2

jmp ex

no: invoke crt_printf,offset msg3

ex: invoke crt_scanf,offset fmt1,offset str1 ;Пауза перед закрытием программы

ret

;esi - адрес матрицы

;ecx - размерность

;Возвращает:

;eax - 1 - симметричны, 0 - не симметричны

check proc

lea edx,[ecx*4+4] ;приращение главной диагонали

lea ebx,[ecx*4-4] ;приращение побочной диагонали

lea edi,[esi+ebx] ;первый элемент побочной диагонали

lp: mov eax,[esi] ;взять элемент с главной диагонали

cmp eax,[edi] ;сравнить с элементом с побочной диагонали

jnz nn ;если не равны, закончить

add esi,edx ;следующий элемент на главной диагонали

add edi,ebx ;следующий элемент на побочной диагонали

loop lp ;сравнить диагонали

mov eax,1 ;симметричны

ret

nn: xor eax,eax ;не симметричны

ret

check endp

out_matrix proc matr:dword

;ввод матрицы

mov edi,0 ;строка

inp1:

mov esi,0 ;столбец

inp:

mov eax,[ebx]

invoke crt_printf,offset fmt2,eax

add ebx,4 ;следующий элемент матрицы

inc esi ;следующий номер элемента строки

cmp esi,n ;пока не ввели всю строку

jb inp ;продолжаем

invoke crt_printf,offset crlf

inc edi ;следующий номер сторки

cmp edi,n ;пока не ввели всю матрицу

jb inp1 ;продолжаем

ret

out_matrix endp

input_matrix proc matr:dword, inmsg:dword

;ввод матрицы

mov ebx,matr ;начало матрицы

mov edi,0 ;строка

inp1:

mov esi,0 ;столбец

inp:

invoke crt_printf,inmsg,edi,esi

invoke crt_scanf,offset fmt0,ebx

add ebx,4 ;следующий элемент матрицы

inc esi ;следующий номер элемента строки

cmp esi,n ;пока не ввели всю строку

jb inp ;продолжаем

inc edi ;следующий номер сторки

cmp edi,n ;пока не ввели всю матрицу

jb inp1 ;продолжаем

ret

input_matrix endp

end _start

end

27.Написать программу на языке Ассемблер с функцией, которая преобразует целое без знака в его двоичное символьное представление. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

n dd 0

res db 64 dup (0)

s11 db 'Input positive integer: ',0

s2 db 'Result: %s',0

fmt1 db '%s',0

fmt2 db '%d',0

char dd 0

.code

_start:

invoke crt_printf,offset s11

invoke crt_scanf,offset fmt2,offset n

mov eax, n

lea edi,res

call printbin

invoke crt_printf,offset s2,offset res

ex: invoke crt_scanf,offset fmt1,offset res

ret

;преобразование числа из ах в двоичную строку по адресу es:еdi

;axe - число

;edi - адрес буфера приемника

printbin proc

mov ebx,eax ;сохраняем eax в ebx

mov ecx,32 ;количество выводимых символов, равно разрядности числа

lp2: mov al,'0' ;символ ноль

rcl ebx,1 ;вращаем ebx на 1 разряд влево через признак переноса

adc al,0 ;добавляем значение переноса к al

stosb ;сохраняем символ в строке

loop lp2 ;выводим все символы

mov al,0 ;Добавить конец строки

stosb

ret ;выход из подпрограммы

printbin endp

end _start

end

28.Написать программу на языке Ассемблер с функцией, которая распечатывает переданную ей строку, удалив из неё символы, не являющиеся буквами и цифрами, и заменяет каждую цифру на **. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.model tiny

.code

org 100h

start:

call EnterString

mov ax,@data

mov ds,ax

xor cx,cx

xor bx,bx; index

xor ax,ax

mov al,[buffer+1]

mov cl,al

test al,al

jz Exit

mov si,offset[buffer+2]

Compare:

mov dl,[si]

cmp dl,'-'

je space

cmp dl,'+'

je space

cmp dl,'_'

je space

cmp dl,' '

je space

cmp dl,'0'

jb print

cmp dl,'9'

ja print

mov dl,'*'

cmp dl,'a'

ja print

cmp dl,'z'

jb print

print:

mov ah,02h

int 21h

space:

inc si

loop Compare

xor ax,ax

int 16h

jmp Exit

EnterString:

mov dx,offset str1

mov ah,09h

int 21h

mov dx,offset buffer

mov ah,0ah

int 21h

mov dx,offset newstr

mov ah,09h

int 21h

ret

Exit:

mov AX,4C00h

int 21h

str1 db 'Enter your string :',0dh,0ah,'$'

buffer db 32,0,32 dup (' ') '$'

newstr db 0dh,0ah,'$'

end start

29.Написать программу на языке Ассемблер с функцией, которая определяет, является ли симметричной заданная символьная строка. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.model tiny

.code

org 100h

start: mov ax,3

int 10h

mov ah,9

mov dx,offset msg

int 21h

mov ah,0Ah

mov dx,offset buffer

int 21h

mov ah,9

mov dx,offset msg1-3

int 21h

call loopP

loopP:

mov bl,buffer+1

mov cx,bx

dec bx

mov si,offset buffer+2

add bx,si

cmp bx,si

je exit

a1: lodsb

cmp al,[bx]

jne exit1

dec bx

loop a1

exit: mov dx,offset msg1+2

jmp a2

exit1: mov dx,offset msg1

a2: mov ah,9

int 21h

mov ah,0

int 16h

ret

msg db "vvedite stroku Enter",0Dh,0Ah,'$'

msg1 db "nepalindrom$"

buffer db 255,?,255 dup(?)

end start

30.Написать программу на языке Ассемблер с функцией, которая по заданному натуральному числу определяет его первую и последнюю цифры. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

n dd 0

s1 db 'N: ',0

str1 db 'first = %d',13,10,0

str2 db 'last = %d',0

fmt0 db '%d',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_scanf,offset fmt0,offset n

mov eax,n

call digits ;определить первую и последнюю цифры

invoke crt_printf,offset str1,esi

invoke crt_printf,offset str2,edi

ex: invoke crt_scanf,offset fmt1,offset str1 ;Пауза перед закрытием программы

ret

;определение первой и последней цифры числа

;eax - число

;результат - esi - первая

;edi - последняя

digits proc

mov ebx,10 ;основание системы

xor ecx,ecx ;признак первой цифры

@@m1a: xor edx,edx ;очистить старшую часть делимого

div ebx ;делим число на степени 10

test ecx,ecx ;если не первая

jnz m1 ;то пропускаем

mov edi,edx ;запомнить первую

mov ecx,1 ;сбросить признак первой

m1: test eax,eax ;после деления остался 0?

jnz @@m1a ;если нет, продолжаем

mov esi,edx ;запомнить послкднюю

ret

digits endp

end _start

end

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