
- •5. Использование логических и сдвиговых операций.
- •6. Стандартные директивы определения сегментов.
- •7. Упрощенные директивы определения сегментов.
- •8. Организация и использование стека.
- •9. Структура программ типа .Com и .Exe.
- •10. Организация обслуживания прерываний. Типы прерываний. Таблица векторов прерываний.
- •11. Подпрограммы. Передача параметров. Ближние и дальние процедуры.
- •12. Повторяющиеся блоки и макросы.
- •13. Вывод информации на экран. Видеорежимы. Видеопамять
- •14. Строковые команды. Префиксы повторения.
- •15. Организация циклов, условных и безусловных переходов
- •16. Мультимодульные программы.
- •17. Обработчики прерываний и резидентные программы.
- •19. Интерфейс модулей, написанных на языке ассемблера с модулями, написанными на языке с.
- •20. Вызов из программы, написанной на языке с , процедур, написанных на ассемблере.
- •21. Вызов из ассемблерной программы функций на языке с.
- •22. Использование встроенного ассемблера.
- •26. Обработка переполнения при делении чисел. Числа ввести с клавиатуры
- •32. В сегменте данных расположены числа в формате двойного слова. С клавиатуры вводится число и определяется, имеется ли это число в сегменте данных.
- •35. Ввести с клавиатуры массив чисел. Найти суммы положительных и отрицательных чисел. Вывести результат.
- •42. Работа с окнами в текстовом режиме.
- •52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.
- •53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.
- •54. Отсортировать слова в строке (по длине слова, по алфавиту).
- •55. Удалить из строки заданное слово.
- •58. В массиве подсчитать число элементов, лежащих в заданном диапазоне.
- •59. Арифметические операции со знаковыми и беззнаковыми числами.
- •60. Процедуры в ассемблере, передача параметров, возврат значений.
- •61. Операции с файлами: создание, открытие, закрытие.
- •62. Операции с файлами: чтение и запись данных.
22. Использование встроенного ассемблера.
Необходимо задать дерективу #pragma inline
Асм. команду записывают в виде asm код_операции операнды (;) или (новая строка)
код_операции - (mov,xor...) Если необходимо задать много асм. команд, то они заключаются в фигурные скобки.
Коментарии ожно записывать только в форме, принятой в языке С++.
21. Транспонирование матрицы заданной в кодовом сегменте.
.model small
.stack 100h
.code
start:
jmp continue ; оставить место для матрицы
razmer equ 4
matrix dw 1,2,3,4
dw 5,6,7,8
dw 9,10,11,12
dw 13,14,15,16
continue:
push cs
pop ds ; направляем ds на сегмент кода
mov si,2 ; si - указывает на matrix[0][1]
mov bx,razmer ; в bx - размер матрицы
shl bx,1 ; bx=bx*2, то есть bx указывает на matrix[1][0]
mov ax,bx ; в ax - смещение, равное длине строки
mov cx,razmer ; в cx - razmer
dec cx ; количество перестановок на 1 меньше, чем размер матрицы
loop1: ; внешний цикл по строкам
push cx ; сохранить cx в стеке
loop2: ; внутренний цикл по столбцам (выше главной диагонали)
mov dx,matrix[bx] ; в dx - элемент ниже диагонали
mov di,matrix[si] ; в di - элемент выше диагонали
mov matrix[bx],di ; переставляем их
mov matrix[si],dx
add si,2 ; смещаемся вправо
add bx,ax ; смещаемся вниз
loop loop2 ; цикл повторяется cx раз
pop cx ; восстанавливаем сохраненное cx
push ax ; сохраняем в стеке длину строки
mov ax,razmer ; вычисляем, на сколько сместиться, чтобы оказаться
sub ax,cx ; главной диагональю
inc ax
shl ax,1
add si,ax ; смещаемся на matrix[i][i+1], i - номер очередного ци
mov bx,si ; уставнавливаем bx на si
pop ax ; восстанавливаем длину строки
add bx,ax ; смещаем bx на строку вниз
sub bx,2 ; и на 1 элемент назад
loop loop1 ; цикл, пока cx != 0
mov ah,4ch
int 21h
end start
22. Ввод символа. Определить его позицию в строке и вывести на экран
.model small
.stack 100h
.data
stroka db 80 dup(?),'$'
symb db ?,' ','$' ; можно и не выделять память для символа
msg_in db 0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"
msg db 0ah,0dh,"Simvol ","$"
msg1 db "nayden! Ego index - ","$"
msg_err db "ne nayden.","$"
c10 dw 10
.code
start:
mov ax,@data
mov ds,ax
xor bx,bx ; в bx - индекс вводимого символа
input_loop:
mov ah,01h ; считываем символ
int 21h
cmp al,13 ; если это enter
je for_find ; то конец ввода
mov stroka[bx],al ; иначе записываем символ в строку
cmp bx,80 ; если ввели 80 символов
je for_find ; то конец ввода
inc bx ; увеличиваем bx
jmp input_loop
for_find:
lea dx,msg_in ; вывод msg_in
mov ah,09h
int 21h
mov ah,01h ; ввод нужного символа
int 21h
mov byte ptr symb,al ; сохраняем его в symb ( можно использовать любой из свободных регистров, если хошь)
mov cx,bx ; в cx - длина строки
xor bx,bx ; bx - индекс элемента
mov ah,byte ptr symb ; в ah - нужный символ
find:
cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным симв
je found ; если совпадают, то jmp на found
inc bx ; переход к следующему элементу
loop find ; цикл повторяется cx раз
lea dx,msg ; если символ не найден, то
mov ah,09h ; вывод msg
int 21h
lea dx,symb ; вывод самого символа
int 21h
lea dx,msg_err ; вывод msg_err
int 21h
jmp end_program ; завершить программу
found: ; если найден символ
lea dx,msg ; вывод msg
mov ah,09h
int 21h
lea dx,symb ; вывод самого символа
int 21h
lea dx,msg1 ; вывод msg1
int 21h
mov ax,bx ; сохраняем индекс в ax
xor cx,cx ; cx - счетчик цифр
number_to_string:
xor dx,dx ; подготовка к делению
div c10 ; деление
add dx,30h ; в dx - ASCII-код остатка от деления
push dx ; сохраняем его в стеке
inc cx ; инкремент счетчика цифр
cmp ax,0 ; цикл, пока частное ненулевое
jne number_to_string
out_index_loop: ; цикл вывода индекса
pop dx ; извелекаем очередную цифру
mov ah,02h ; выводим ее на экран
int 21h
loop out_index_loop
end_program:
mov ah,4ch
int 21h
end start
25.Ввод с клавиатуры и умножение длинных чисел
.model small
.stack 100h
.data
num1 dd 0
num2 dd 0
proizv dd 0,0
msg1 db 0ah,0dh,"Vvedite pervoe chislo:",0ah,0dh,"$"
msg2 db 0ah,0dh,"Vvedite vtoroe chislo:",0ah,0dh,"$"
c10 dw 10
.code
start:
mov ax,@data
mov ds,ax
lea dx,msg1 ; вывод на экран msg1
mov ah,09h
int 21h
call input ; ввод первого числа
lea bx,num1 ; записываем введенное длинное число в num1:
mov word ptr[bx],si ; младшее слово
mov word ptr[bx+2],di ; старшее слово
lea dx,msg2 ; вывод на экран msg2
mov ah,09h
int 21h
call input ; ввод второго числа
lea bx,num2 ; записываем введенное длинное число
mov word ptr[bx],si
mov word ptr[bx+2],di
mov ax,word ptr num1 ; перемножение чисел (смотри конспект)
mul word ptr num2
mov word ptr proizv,ax
mov word ptr proizv+2,dx
mov ax,word ptr num1
mul word ptr num2+2
add word ptr proizv+2,ax
adc word ptr proizv+4,dx
mov ax,word ptr num1+2
mul word ptr num2
add word ptr proizv+2,ax
adc word ptr proizv+4,dx
mov ax,word ptr num1+2
mul word ptr num2+2
add word ptr proizv+4,ax
adc word ptr proizv+6,dx
mov ah,4ch
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