
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Процедура ввода числа форматом слово
Вычисления в процедуре реализованы по схеме Горнера. Например, число 4851 формируется следующим образом.
АХ:=0. Это начальное значение сумматора.
(((АХ*10+4)*10+8)*10+5)*10+1 =4851. перевод выполняется со старших разрядов числа.
Процедура read входных параметров не имеет. Результат возвращается в регистре AХ.
;Процедура ввода числа формата intger
;Для перевода используется схема Горнера
stak segment STACK 'STACK'
db 64 dup(?)
stak ends
data segment
Bl_Param label byte
len db 7
act db ?
num db 7 dup(?)
c10 dw 10
Msg db 'Ошибка, повторите ввод',13,10,'$'
Ent db 13,10,'$'При выводе курсор переходит в начало след.строки
Sign db ?
data ends
code SEGMENT
assume ss:stak,ds:data,cs:code
start proc far
;--------------Возврат в dos
push ds
sub ax,ax
push ax
;--Занесение в регистр ds адреса сегмента данных
mov ax,data
mov ds,ax
;--------------Начало программы
call read
mov ax,ax ;а
st_ret: ret
start endp
read proc near
push bx cx dx si
M_Beg:
;Ввод числовой строки
mov ah,0ah
lea dx,Bl_param
int 21h
mov ah,09h
lea dx,Ent
int 21h
mov Sign,-1;Знак числа не определен
mov si,0
;Цикл прохода по числовой строке до первой цифры числа
;Определяется знак числа
c1:
cmp act,0
je M_Err
cmp Sign,-1
jne M_c2
cmp num[si],' '
je M1_c1
cmp num[si],'-'
jne M2_c1
mov Sign,1; Знак отрицательный
jmp M1_c1
M2_c1:
mov Sign,0; Знак положительный
cmp num[si],'+'
je M1_c1
jmp c1
M1_c1:
inc si
dec act
jmp c1
;Сообщение об ошибке и переход в начало для повторного ввода
M_Err:
mov ah,09h
lea dx,Msg
int 21h
jmp M_Beg
; Теперь num[si] указывает на первую цифру числа. Выполним перевод числа
; в машинное представление, используя схему Горнера.
M_c2:
mov ax,0
mov cx,0
mov cl,act;В СХ количество цифр числа
C2:
imul c10
jo M_Err
cmp num[si],'0'
jb M_Err
cmp num[si],'9'
ja M_Err
mov bl,num[si];Код символа в BL преобразуем
and bx,000Fh; в число
add ax,bx
jo M_Err
inc si
loop c2
cmp Sign,1;Если число отрицательное
jne M_exit; меняем знак
neg ax ; на противоположный.
M_exit:
pop si dx cx bx
ret
read endp
code ends
end start