
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;пользователь вводит в текстовом виде в buf значение числа
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
- •Int 21h ;выводим на экран
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 ;выводимое сообщение