- •24. Ввод символа. Определить его позицию в строке и вывести на экран
- •Int 21h
- •30. Найти сумму элементов четных строк матрицы.
- •37. Перевод числа из одной системы счисления в другую. Данные вводить с клавиатуры.
- •Int 21h
- •42. Работа с окнами в текстовом режиме.
- •Inc si ;перейти к следующему элементу
- •Int 21h
- •59. Арифметические операции со знаковыми и беззнаковыми числами.
- •60. Процедуры в ассемблере, передача параметров, возврат значений.
- •61. Операции с файлами: создание, открытие, закрытие.
- •Int 21h ;открываем файл
- •Int 21h ;закрываем файл
- •62. Операции с файлами: чтение и запись данных.
- •Int 13h ;
- •Int 25h ;функция чтения секторов
Int 21h
input proc ; процедура ввода длинного числа
xor si,si ; возвращает число в di:si
xor di,di
loop1:
mov ah,01h
int 21h
cmp al,13
je end_input
sub al,30h
xor bx,bx
mov bl,al
mov ax,di
mul c10
mov di,ax
mov ax,si
mul c10
add ax,bx
adc dx,di
mov di,dx
mov si,ax
jmp loop1
end_input:
ret
input endp
end start
26. Обработка переполнения при делении чисел. Числа ввести с клавиатуры
Используя команды DIV и особенно IDIV, очень просто вызвать
пеpеполнение. Прерывания приводят (по крайней мара в системе, используемой
при тестировании этих программ) к непредсказуемым результатам. В операциях
деления предполагается, что частное значительно меньше, чем делимое.
Деление на ноль всегда вызывает прерывание. Но деление на 1 генерирует
частное, которое равно делимому, что может также легко вызвать прерывание.
Рекомендуется использовать следующее правило: если делитель - байт,
то его значение должно быть меньше, чем левый байт (AH) делителя: если
делитель - слово, то его значение должно быть меньше, чем левое слово (DX)
делителя. Проиллюстрируем данное правило для делителя, равного 1:
Операция деления: Делимое Делитель Частное
Слово на байт: 0123 01 (1)23
Двойное слово на слово: 0001 4026 0001 (1)4026
В обоих случаях частное превышает возможный размер. Для того чтобы
избежать подобных ситуаций, полезно вставлять перед командами DIV и IDIV
соответствующую проверку. В первом из следующих примеpов предположим, что
DIVBYTE - однобайтовый делитель, а делимое находится уже в регистре AX. Во
втором примере предположим, что DIVWORD - двухбайтовый делитель, а делимое
находится в регистровой паре DX:AX.
Слово на байт Двойное слово на байт
CMP AH,DIVBYTE CMP DX,DIVWORD
JNB переполнение JNB переполнение
DIV DIVBYTE DIV DIVWORD
Для команды IDIV данная логика должна учитывать тот факт, что либо
делимое, либо делитель могут быть отрицательными, а так как сравниваются
абсолютные значения, то необходимо использовать команду NEG для временного
перевода отрицательного значения в положительное.
27. Дана строка в сегменте кода. Отсортировать методом выборки
.model small
.stack 100h
.code
start:
jmp continue
stroka db 254, 0 dup(255)
continue:
push cs
pop ds ; направляем ds на сегмент кода
mov bx,2
xor dx, dx
mov ah, 0Ah
int 21h
mov ah, 0dh
xor di,di
loop1:
mov al,stroka[bx]
cmp ah,stroka[bx+1] ; проверка, конец строки или нет
je end_program
mov si,bx
inc si
loop2: ; поиск
cmp ah,stroka[si]
je end_loop1
cmp al,stroka[si]
jna next_iter ; поиск
mov al,stroka[si] ; минимального
mov di,si ; элемента
next_iter:
inc si
jmp loop2
end_loop1:
mov dh,stroka[bx] ;перестановка
mov stroka[bx],al ;
mov stroka[di],dh
inc bx
jmp loop1
end_program:
mov ah,09h
lea dx,stroka
int 21h
mov ah,4ch
int 21h
end start
28 Транспонировать битовую матрицу использую операторы сдвига.
.model small
.stack 100h
.data
mes1 db 10,13,"Vvedite elementy matricy(8 elem)!!$"
mes2 db 10,13,"$"
mas db 8 dup(0)
mas_tr db 8 dup(0)
.code
begin:
mov ax,@data ;перемещаем сегмент данных в ах
mov ds,ax ;перемещаем сегмент данных в dx
lea dx,mes1 ;в dx адрес mes1
mov ah,9h ;вывод строкм mas1
int 21h
xor bx,bx
mov cx,8
again: ;ввод массива
mov ah,1
int 21h
sub al,'0'
mov mas[bx],al
inc bx
loop again ;повторение цикла again, пока сх не = 0
lea dx,mes2 ;адрес mes2 в dX
mov ah,9
int 21h
mov cx,8
xor bx,bx
xor dh,dh
output: ; вывод матрицы
mov dl,mas[bx]
add dx,30h
mov ah,2
int 21h
inc bx
loop output
mov cx,8
lea di,mas_tr
repeat: ;транспонирование
push cx
mov cx,8
lea si,mas
rep1:
rol BYTE PTR[si],1
rcl al,1
inc si
loop rep1
pop cx
mov [di],al
inc di
loop repeat
exit:
mov ah,4с00h
int 21h end begin
29. В сегменте данных дана матрица. Отсортировать ее побочную дигональ
.model small
.stack 100h
.data
razmer equ 4
matrix dw 1,2,3,13
dw 5,6,10,8
dw 9,7,11,12
dw 4,14,15,16
.code
start:
mov ax,@data
mov ds,ax
mov cx,razmer
dec cx
mov bx,cx
shl bx,1 ; bx - смещение (длина строки -2)
loop1:
mov si,bx
push cx
loop2:
mov dx,matrix[si] ;
mov di,matrix[si][bx] ; перестановка
cmp dx,di ;
jl cont_loop2
mov matrix[si],di
mov matrix[si][bx],dx
cont_loop2:
add si,bx ;
loop loop2 ; смещение на следующую строку
pop cx ;
loop loop1
lea dx,matrix
mov ah,4ch
int 21h
end start