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

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

.model tiny

.code

org 100h

start:

call scanToBuffer

mov si,offset StrRes

mov bp,offset buffer

call invert

mov ah,9

mov dx,offset message2

int 21h

mov ah,9

mov dx,offset StrRes

int 21h

ret

scanToBuffer:

mov dx,offset message1

mov ah,9

int 21h

mov dx,offset buffer

mov ah,0Ah

int 21h

mov dx,offset crlf

mov ah,9

int 21h

ret

invert:

xor bx,bx

xor cx,cx

xor di,di

mov cl,blength

add si,cx

mov bl,'$'

mov [si],bl

dec si

add bp,2

cloop1:

mov bl,[bp][di]

mov [si],bl

inc di

dec si

cmp di,cx

jb cloop1

ret

message1 db 'Enter string: $'

message2 db 'Result is: $'

crlf db 0Dh,0Ah,'$'

StrRes db 100h dup(?)

buffer db 20

blength db ?

bcontents:

end start

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

.model small

.data

M dw 0 ;строк

N dw 0 ;столбцов

A dw 10*10 dup (0) ;Матрица

inpm db 13,10,'Input matrix:$'

msg1 db 13,10,'M strok: $'

msg2 db 13,10,'N stolbcov: $'

msg3 db 13,10,'Matrix: ',13,10,'$'

msg4 db 13,10,'Min = $'

str0 db 0dh,0ah,'A($' ;формируемая для вывода строка

str1 db ')= $'

buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры

.stack 256

.code

start:

mov ax,@data ;Настраиваем сегментные регистры

mov ds,ax

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg1 ;выводимое сообщение

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение числа

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov M,ax ;сохраняем

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg2 ;выводимое сообщение

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение числа

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov N,ax ;сохраняем

mov ah,9 ;функция вывода сообщения на экран

lea dx,inpm ;выводимое сообщение

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

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

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

mov cx,1 ;строка

mov di,1 ;столбец

inpmas: mov ah,9 ;функция вывода сообщения на экран

lea dx,str0 ;(

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

mov ax,cx ;строка

call printdec ;преобразуем номер строки в текст и выводим на экран

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

mov dl,',' ;запятая

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

mov ax,di ;столбец

call printdec ;выводим на экран

mov ah,9 ;функция вывода сообщения на экран

lea dx,str1 ;)=

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov [bx],ax ;заносим значение в массив

add bx,2 ;следующий элемент

inc di ;номер следующего столбца

cmp di,N ;сравниваем с шириной матрицы

jbe inpmas ;если меньше или рано, продолжить

mov di,1 ;первый столбец

inc cx ;следующая строка

cmp cx,M ;сравниваем с высотой матрицы

jbe inpmas ;если меньше или рано, продолжить

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

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg3 ;выводимое сообщение

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

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

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: mov ah,9 ;функция вывода сообщения на экран

lea dx,msg4 ;выводимое сообщение

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

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

mov ax,M ;кол-во строк

mul N ;умножить на кол-во столбцов

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

;поиск минимального элемента матрице

mov ax,[si] ;инициализировать начальный минимальный элемент

fndmin: cmp [si],ax ;если текущий элемент меньше не минимального

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

mov ax,[si] ;если меньше - сделать его минимальным

m1: add si,2 ;адрес следующего элемента

loop fndmin ;найти минимальный элемент матрицы

call printdec ;вывести минимальный элемент

mov ah,1 ;Ожидаем нажатия любой клавиши

int 21h

mov ax,4c00h ;закончить программу

int 21h

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

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

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

s db 256 dup (0)

s1 db 'Input octal string: ',0

s2 db 'Not octal number.',0

fmt1 db '%s',0

fmt2 db '%s(OCT)=%d(DEC)',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_scanf,offset fmt1,offset s

lea esi,s

call str2dw

jb err

invoke crt_printf,offset fmt2,offset s,eax

ex: invoke crt_scanf,offset fmt1,offset s

ret

err:

invoke crt_printf,offset s2

jmp ex

str2dw proc

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

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

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

;сf=1 если строка содержит недопустимый символ

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

push esi

xor edx,edx ;сумма

@lp1: xor eax,eax

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

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

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

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

ja @errex ;то пропускаем

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

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

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

shl edx,3 ;умножаем сумму на 8

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

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

@ex: mov eax,edx ;помещаем результат в ах

clc ;сбросить признак ошибки

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

pop edx

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

@errex: stc ;установить признак ошибки

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

pop edx

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

str2dw endp

end _start

end

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

.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: %s',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_gets,offset s

lea esi,s

call pack

invoke crt_printf,offset s2,offset s

ex: invoke crt_scanf,offset fmt1,offset s

ret

pack proc

mov edi,esi ;dst=src

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

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

jz pl ;то не сохранять

stosb ;сохранить символ

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

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

ret

pack endp

end _start

end

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

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

s db 256 dup (0)

s1 db 'Input string: ',0

s11 db 'Input char: ',0

s2 db 'Result: %d',0

fmt1 db '%s',0

fmt2 db '%c',0

char dd 0

.code

_start:

invoke crt_printf,offset s1

invoke crt_gets,offset s

invoke crt_printf,offset s11

invoke crt_scanf,offset fmt2,offset char

mov al, byte ptr char

lea esi,s

call count ;подсчет

invoke crt_printf,offset s2,eax

ex: invoke crt_scanf,offset fmt1,offset s

ret

;на входе:

;esi - строка

;al - подсчитываемый символ

;на выходе:

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

count proc

xor edx,edx ;кол-во вхождений

lp: cmp [esi],byte ptr 0 ;если конец строки

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

cmp al,[esi] ;если очередной символ не совпал с искомым

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

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

sk: inc esi ;след символ

jmp lp ;продолжить подсчет

fin:

mov eax,edx ;поместить результат в eax

ret

count endp

end _start

end

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

.586

.model flat,stdcall

option casemap:none

include msvcrt.inc

includelib msvcrt.lib

.data

mas dd 100 dup (0)

n dd 0

s1 db 'N: ',0

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

str2 db 'Result: ',0

fmt0 db '%d',0

fmt2 db '%d ',0

fmt1 db '%s',0

.code

_start:

invoke crt_printf,offset s1

invoke crt_scanf,offset fmt0,offset n

;ввод массива

mov edi,0 ;Текущий индекс вводимого элемента

inp:

invoke crt_printf,offset str1,edi

lea eax,mas[edi*4] ;вычислить адрес вводимого элемента

invoke crt_scanf,offset fmt0,eax

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

cmp edi,n ;пока не ввели весь массив

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

lea esi,mas

mov ecx,n

call min ;поиск минимума

;замена

mov edi,0 ;Текущий индекс

lp2:

test edi,1 ;проверить текущий индекс на четность

jz sk ;если четный, пропустить

mov mas[edi*4],eax ;если нечетный, заменить минимальным по модулю

sk: inc edi ;следующий номер элемента

cmp edi,n ;пока не обработали весь массив

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

invoke crt_printf,offset str2

;вывод

mov edi,0 ;Текущий индекс выводимого элемента

putp:

mov eax,mas[edi*4] ;взять вводимый элемент

invoke crt_printf,offset fmt2,eax

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

cmp edi,n ;пока не ввели весь массив

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

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

ret

;поиск минимального по модулю элемента

;esi - адрес массива

;ecx - кол-ко элементов массива

;возвращает в eax - минимальный по модулю элемент

min proc

mov eax,[esi] ;взять начальный минимум

lp: add esi,4 ;адрес следующего элемента

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

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

mov edx,[esi] ;взять очередной элемент

test edx,edx ;проверить его

jns m1 ;если не отрицательный, пропустить

neg edx ;если отрицательный, взять модуль

m1: mov ebx,eax ;взять текущий минимум

test ebx,ebx ;проверить его

jns m2 ;если не отрицательный, пропустить

neg ebx ;если отрицательный, взять модуль

m2: cmp edx,ebx ;сравнить мин модуль с текущим

jnl lp ;если текущий не меньше минимального, пропустить

mov eax,[esi] ;если меньше, запомнить новое минимальное по модулю число

jmp lp ;продолжить поиск

fin1:

ret

min endp

end _start

end

7.Написать программу на языке Ассемблер с функцией, которая в прямоугольной матрице находит сумму элементов j-ой строки. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.(Бежимбаев Джаныбек)

.model small

.data

M dw 0 ;строк

N dw 0 ;столбцов

A dw 10*10 dup (0)

inpm db 13,10,'Input matrix:$'

msg1 db 13,10,'M strok: $'

msg2 db 13,10,'N stolbcov: $'

msg3 db 13,10,'Matrix: ',13,10,'$'

str3 db 13,10,'sum = $'

str2 db 13,10,'N stroki j (0...M-1): $'

str0 db 0dh,0ah,'A($' ;формируемая для вывода строка

str1 db ')= $'

buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры

.stack 256

.code

start:

mov ax,@data ;Настраиваем сегментные регистры

mov ds,ax

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg1 ;выводимое сообщение

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение числа

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov M,ax ;сохраняем

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg2 ;выводимое сообщение

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение числа

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov N,ax ;сохраняем

mov ah,9 ;функция вывода сообщения на экран

lea dx,inpm ;выводимое сообщение

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

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

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

mov cx,1 ;строка

mov di,1 ;столбец

inpmas: mov ah,9 ;функция вывода сообщения на экран

lea dx,str0 ;(

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

mov ax,cx ;строка

call printdec ;преобразуем номер строки в текст и выводим на экран

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

mov dl,',' ;запятая

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

mov ax,di ;столбец

call printdec ;выводим на экран

mov ah,9 ;функция вывода сообщения на экран

lea dx,str1 ;)=

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

mov ah,0ah ;функция ввода строки с клавиатуры

mov dx,offset buf ;буфер куда вводить

int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива

lea si,buf[2] ;начало введенного текста

call str2dw ;преобразовываем строку в значение

mov [bx],ax ;заносим значение в массив

add bx,2 ;следующий элемент

inc di ;номер следующего столбца

cmp di,N ;сравниваем с шириной матрицы

jbe inpmas ;если меньше или рано, продолжить

mov di,1 ;первый столбец

inc cx ;следующая строка

cmp cx,M ;сравниваем с высотой матрицы

jbe inpmas ;если меньше или рано, продолжить

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

mov ah,9 ;функция вывода сообщения на экран

lea dx,msg3 ;выводимое сообщение

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