
- •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 ;выводим на экран
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