- •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,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,str2 ;выводимое сообщение
Int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
Int 21h ;пользователь вводит в текстовом виде в buf значение числа
lea si,buf[2] ;начало введенного текста
call str2dw ;преобразовываем строку в значение
cmp ax,M
jae ex1
mov bx,ax ;сохраняем
mov ah,9 ;функция вывода сообщения на экран
lea dx,str3 ;выводимое сообщение
Int 21h ;выводим на экран
call sum
call printdec
mov ah,1 ;Ожидаем нажатия любой клавиши
int 21h
mov ax,4c00h ;закончить программу
int 21h
;функция подсчета сумыы сроки матрицы
;на входе bx - индекс строки 0,1,...
;На выхое ax - сумма
sum proc
mov ax,bx ;индекс строки
mul N ;получить номер элемента в матрице с началом строки
shl ax,1 ;умножить на 2
mov bx,ax ;индекс элемента матрицы с которого начинается строка
xor ax,ax ;сумма
mov cx,N ;кол-во элементов в строке
s1: add ax,A[bx] ;прибавить очередной элемент
add bx,2 ;следующий элемент
loop s1 ;просуммировать всю строку
ret
sum 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
8.Написать программу на языке Ассемблер с функцией, которая по заданному натуральному числу определяет количество цифр в нём и их сумму. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.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',13,10,0
str2 db 'sumdigits = %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 esi,esi ;в esi будет количество цифр в десятичном числе
xor edi,edi ;сумма цифр числа
@@m1a: xor edx,edx ;очистить старшую часть делимого
div ebx ;делим число на степени 10
add edi,edx ;прибавляем остаток от деления к сумме цифр
inc esi ;увеличиваем количество десятичных цифр числа
test eax,eax ;после деления остался 0?
jnz @@m1a ;если нет, продолжаем
ret
digits endp
end _start
end
9.Написать программу на языке Ассемблер с функцией, которая по заданной строке формирует новую строку, состоящую только из цифр, входящих в исходную строку. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.model tiny
.code
org 100h
NUpoehali:
mov dx,offset mes1
mov ah,9
int 21h
mov dx,offset buf
mov ah,0Ah
int 21h
mov dx,offset mes2
mov ah,9
int 21h
xor cx,cx
xor di,di
xor bx,bx
mov cl,len
mov si,offset newstr
FOR1:
mov bl,byte ptr bcontent[di]
cmp bl,'0'
jb NPR
cmp bl,'9'
ja NPR
mov [si],bx
inc si
NPR:
;mov [si],bx
;inc si
inc di
loop FOR1
mov bl,'$'
mov [si],bx
mov dx,offset newstr
mov ah,9
int 21h
ret
mes1 db 'Vvedite stroku $'
mes2 db 0Dh, 0Ah, '$'
newstr db 255 DUP(?)
buf db 16
len db ?
bcontent:
end NUpoehali
10.Написать программу на языке Ассемблер с функцией, подсчитывающей количество положительных элементов в массиве. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.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 'Count of positives = %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 countpos ;подсчет кол-ва положительных
invoke crt_printf,offset fmt2,eax
ex: invoke crt_scanf,offset fmt1,offset mas ;Пауза перед закрытием программы
ret
;подсчет кол-ва положительных элементов
;esi - адрес массива
;ecx - кол-ко элементов массива
;возвращает в eax - кол-во положительных элементов массива
countpos proc
xor eax,eax ;кол-во положительных элементов
lp: cmp [esi],dword ptr 0 ;ставнить очередной элемент массива с 0
js m1 ;если отрицательный, то пропустить
jz m1 ;ноль так же не является положительным числом
inc eax ;увеличить кол-во положительных чисел
m1: add esi,4 ;следующий элемент массива
loop lp ;подсчитать кол-во положительных элементов
ret
countpos endp
end _start
end
11.Написать программу на языке Ассемблер с функцией для замены символов ‘:’ на ‘.’ в переданной ей строке, начиная с указанной позиции. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.586
.model flat,stdcall
option casemap:none
include msvcrt.inc
includelib msvcrt.lib
.data
s db 256 dup (0)
pos dd 0
s1 db 'Input string: ',0
s11 db 'Input pos(zero based): ',0
s2 db 'Result: %s',0
fmt1 db '%s',0
fmt2 db '%d',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 pos
mov eax, pos
lea esi,s
call replace
invoke crt_printf,offset s2,offset s
ex: invoke crt_scanf,offset fmt1,offset s
ret
;на входе:
;esi - строка
;eax - позиция с которой начинать замену
replace proc
xor edx,edx ;текущая позиция
lp: mov cl,[esi+edx] ;взять очередной символ
cmp cl,0 ;если конец строки
jz fin ;то закончить
cmp edx,eax ;если текущая позиция меньше заданной
jb sk ;то пропустить
cmp cl,':' ;если это не двоеточие
jnz sk ;то пропустить
mov [esi+edx],byte ptr '.' ;заменить двоеточие на точку
sk: inc edx ;следующая позиция
jmp lp ;продолжить замену
fin:
ret
replace endp
end _start
end
12.Написать программу на языке Ассемблер с функцией, которая по переданному ей целому числу М подсчитывает все трёхзначные десятичные числа, сумма цифр которых равна М или сообщает о том, что их нет. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.(Дархан)
.model tiny
.code
org 100h
start:
xor ax,ax
mov cx, 100
for1:
push cx
call summa ; vizov funkcii dlya podscheta summi trexznachnogo chisla
pop cx
cmp si, M ; chislo M sravniem s summoi cifr trexznachnogo chisla
jz yes ; esli ravno to na metku yes
jnz net ; esli ne ravni to na metku net
yes:
mov ah,09h
mov dx,offset rslt ; pechataem text 'summa cifr'
int 21h
mov ax, cx
push cx
call printFromAX
pop cx
net:
inc cx ; uvelichivaem i+1
cmp cx, 1000
jnz for1
ret
reverse1:
not ax
add ax,1
ret
printFromAX:
push ax
mov si,ax
and si,8000h
cmp si,0
jz dalee4
call reverse2
dalee4:
mov si,10
mov di,0
cloop2:
xor dx,dx
div si
push dx
inc di
cmp ax,0
ja cloop2
mov cx,di
cloop3:
pop dx
add dl,'0'
mov ah,2
int 21h
loop cloop3
pop ax
ret
reverse2: push ax
push dx
mov dl,'-'
mov ah,2
int 21h
pop dx
pop ax
call reverse1
ret
summa: mov ax, cx
xor si, si
xor dx,dx
mov bx,10 ; esli ono desyatichnoe to delim na 100, esli 16richnoe to delim na 100h
div bx
add si, dx
xor dx, dx
mov bx,10 ; 10 ili 10h
div bx
add si, dx
add si, ax
ret
M dw ?
rslt db 13,10, 'summa cifr ravnaya M: $'
end start
13.Написать программу на языке Ассемблер с функцией для вычисления площади треугольника, заданногокоординатами вершин .586
.model flat,stdcall
option casemap:none
include msvcrt.inc
includelib msvcrt.lib
.data
s db 256 dup (0)
pos dd 0
s1 db 'Input string: ',0
s11 db 'Input pos(zero based): ',0
s2 db 'Result: %s',0
fmt1 db '%s',0
fmt2 db '%d',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 pos
mov eax, pos
lea esi,s
call replace
invoke crt_printf,offset s2,offset s
ex: invoke crt_scanf,offset fmt1,offset s
ret
;на входе:
;esi - строка
;eax - позиция с которой начинать замену
replace proc
xor edx,edx ;текущая позиция
lp: mov cl,[esi+edx] ;взять очередной символ
cmp cl,0 ;если конец строки
jz fin ;то закончить
cmp edx,eax ;если текущая позиция меньше заданной
jb sk ;то пропустить
cmp cl,':' ;если это не двоеточие
jnz sk ;то пропустить
mov [esi+edx],byte ptr '.' ;заменить двоеточие на точку
sk: inc edx ;следующая позиция
jmp lp ;продолжить замену
fin: ret
replace endp
end _start
end
14.Написать программу на языке Ассемблер с функцией, которая определяет, есть ли в переданной ей строке слова, оканчивающиеся на ‘f’, и сколько таких слов. (Слова разделяются пробелами.) Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
org 100h
.MODEL Tiny
.CODE
ORG 100h
begin:
mov ax,@data
mov ds,ax
mov dx,offset MyStr
mov ah,09h
int 21h
mov di, -2
M3: mov si, 0
add di, 2
xor al,al
M1: mov al, MyStr[si]
cmp al, Sim1[0]
jne M2
mov al,MyStr[si-1]
cmp al,Sim2[0]
jne M2
mov al,Sim2[0]
mov Sim3[di],al
inc found
inc di
;mov al, Sim2[0]
;mov MyStr[si], al
M2: inc si
cmp MyStr[si], '$'
jne M1
mov ah,02h
mov dl,found
add dl,30h
int 21h
ret
MyStr db 'bbsdasdf bbf assf dsadsdsdf www ','$ '
Sim1 db ' ','$'
Sim2 db 'f','$'
Sim3 db ' ','$'
found db ?
ret
end begin
15.Написать программу на языке Ассемблер с функцией для нахождения в прямоугольной матрице номера строки, имеющей максимальную сумму элементов.
.586
.model flat,stdcall
option casemap:none
include msvcrt.inc
includelib msvcrt.lib
.data
mas dd 100 dup (0)
n dd 0
m dd 0
s1 db 'M: ',0
s2 db 'N: ',0
str1 db 'MAS(%d)(%d) = ',0
str2 db 'Row with max sum = %d',0
fmt0 db '%d',0
fmt1 db '%s',0
.code
_start: invoke crt_printf,offset s1
invoke crt_scanf,offset fmt0,offset m
invoke crt_printf,offset s2
invoke crt_scanf,offset fmt0,offset n
;ввод матрицы
lea ebx,mas ;начало матрицы
mov edi,0 ;строка
inp1:mov esi,0 ;столбец
inp:invoke crt_printf,offset str1,edi,esi
invoke crt_scanf,offset fmt0,ebx
add ebx,4 ;следующий элемент матрицы
inc esi ;следующий номер элемента строки
cmp esi,n ;пока не ввели всю строку
jb inp ;продолжаем
inc edi ;следующий номер сторки
cmp edi,m ;пока не ввели всю матрицу
jb inp1 ;продолжаем
call find ;поиск максимальной суммы строки
invoke crt_printf,offset str2,eax
ex: invoke crt_scanf,offset fmt1,offset mas ;Пауза перед закрытием программы
ret
;поиск минимального по модулю элемента
;возвращает в eax - индекс строки с максимальной суммой
find proc
xor ebp,ebp ;признак того, расчитали начальную макс сумму 0-нет, 1-да
lea ebx,mas ;начало матрицы
mov edi,0 ;строка
lp1:mov esi,0 ;столбец
xor edx,edx ;сумма строки
lp: add edx,[ebx] ;прибавить к сумме очередной элемент строки
add ebx,4 ;следующий элемент строки
inc esi ;следующий номер элемента
cmp esi,n ;пока не просуммировали всяю строку
jb lp ;продолжаем
test ebp,ebp ;если начальный максимум инициализирован
jnz m2 ;то пропустить
mov ecx,edx ;иначе запомнит начальный максимум
mov eax,esi ;номер строки с макс суммой
mov ebp,1 ;больше не возвращаться на эту ветку
m2: cmp edx,ecx ;если сумма текущей строки меньше или равна максимальной
jle m1 ;то пропустить
mov ecx,edx ;запомнить максимальную сумму
mov eax,edi ;и номер строки
m1: inc edi ;следующий номер строки
cmp edi,m ;пока не прошли всю матрицу
jb lp1 ;продолжить
ret
find endp
end _start
end
16.Написать программу на языке Ассемблер с функцией, которая преобразует строку двоичных цифр в эквивалентное ей целое десятичное число. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.586
.model flat,stdcall
option casemap:none
include msvcrt.inc
includelib msvcrt.lib
.data
s db 256 dup (0)
s1 db 'Input binary string: ',0
s2 db 'Not binary number.',0
fmt1 db '%s',0
fmt2 db '%s(BIN)=%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,'1' ;если это не цифра,
ja @errex ;то пропускаем
cmp al,'0' ;если это не цифра,
jb @errex ;то пропускаем
sub al,'0' ;получаем цифровое значение
shl edx,1 ;умножаем сумму на 2
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
17.Написать программу на языке Ассемблер с функцией, которая в строке, передаваемой ей в качестве параметра, заменяет каждый второй элемент на заданный символ. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.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: %s',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 replace ;подсчет
invoke crt_printf,offset s2,offset s
ex: invoke crt_scanf,offset fmt1,offset s ;пауза перед закрытием
ret
;на входе:
;esi - строка
;al - заменяемый символ
replace proc
xor edx,edx ;номер символа в строке
lp: cmp [esi+edx],byte ptr 0 ;если конец строки
jz fin ;то закончить
test edx,1 ;проверить четность номера символа
jz sk ;если четный, пропустить
mov [esi+edx],al ;заменить на заданный символ
sk: inc edx ;следующий номер символа
jmp lp ;продолжить подсчет
fin:
ret
replace endp
end _start
end
18.Написать программу на языке Ассемблер с функцией для сложения и вычитания квадратных матриц. Одним из параметров должен быть признак вида операции. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.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)
B dd 100 dup (0)
R dd 100 dup (0)
n dd 0
m dd 0
s1 db 'M: ',0
s2 db 'N: ',0
str1 db 'A(%d)(%d) = ',0
str11 db 'B(%d)(%d) = ',0
s3 db 'A: ',13,10,0
s4 db 'B: ',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 'Input matrix B',13,10,0
msg3 db 'A+B = ',13,10,0
msg4 db 'A-B = ',13,10,0
.code
_start:
invoke crt_printf,offset s1
invoke crt_scanf,offset fmt0,offset m
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 msg2
invoke input_matrix,offset B,offset str11
invoke crt_printf,offset s3
mov ebx,offset A
call out_matrix
invoke crt_printf,offset s4
mov ebx,offset B
call out_matrix
invoke crt_printf,offset msg3
lea esi,A
lea edi,B
lea ebx,R
mov cl,0
call addsubmatr
lea ebx,R
call out_matrix
invoke crt_printf,offset msg4
lea esi,A
lea edi,B
lea ebx,R
mov cl,1
call addsubmatr
lea ebx,R
call out_matrix
ex: invoke crt_scanf,offset fmt1,offset str1 ;Пауза перед закрытием программы
ret
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,m ;пока не ввели всю матрицу
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,m ;пока не ввели всю матрицу
jb inp1 ;продолжаем
ret
input_matrix endp
;esi - матрица A
;edi - матрица B
;ebx - результат
;cl =0 - сложение
;cl =1 - вычитание
addsubmatr proc
mov eax,m ;кол-во строк
mul n ;умножить на кол-во столбцов
mov edx,eax ;кол-во элементов в матрице
lp: mov eax,[esi] ;взять элеметн из первой матрицы
cmp cl,0 ;если сложение,
jz m1 ;то переход
sub eax,[edi] ;вычесть из элемента первой матрицы элемент второй матрицы
jmp m2
m1: add eax,[edi] ;сложить элементы первой и второй матрицы
m2: mov [ebx],eax ;сохранить результат
add esi,4 ;перейти к следующим элементам матриц
add edi,4
add ebx,4
dec edx ;уменьшить кол-во оставшихся элементов
jnz lp ;продолжать пока не 0
ret
addsubmatr endp
end _start
end
19.Написать программу на языке Ассемблер с функцией, которая определяет, располагаются ли буквы в заданной символьной строке в алфавитном порядке. Исходные данные необходимо вводить с клавиатуры, результат выводить на консоль.
.model small
.data
msg1 db 13,10,'Input string: $'
msg2 db 13,10,'String in alphabetic order.$'
msg3 db 13,10,'String not in alphabetic order.$'
buf db 80,81 dup(0) ;принимает строку, введенную с клавиатуры
.stack 256
.code
start:
mov ax,@data ;Настраиваем сегментные регистры
mov ds,ax
;ввод cnhjrb
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
