Ассемблер Intel 8086

Содержание

Слайд 2

Ассемблер Intel 8086 Вывод строки. dosseg .model small .stack 200h .data

Ассемблер Intel 8086

Вывод строки.

dosseg
.model small
.stack 200h
.data
Msg db 'This text should appear

on the screen' ; размещаем (в
; сегменте данных) выводимую строку
Len = $-Msg ; Len присваиваем
;значение длины строки (разница
; между текущим смещением в
;сегменте и смещением до Msg)
.code
Begin:
mov ax,@Data
mov ds, ax
Mov cx,Len ; инициализируем счетчик цикла
Lea si,Msg ; устанавливаем si на начало области Msg (на
; первый байт выводимой строки)
M: Mov ah,02 ; номер функции помещаем в ah
Mov dl,[si] ; код выводимого символа помещаем в dl
Int 21h ; передаем управление DOS
Inc si ; продвигаем si к следующему символу (байту)
Loop M ; организуем цикл с меткой М
mov ax, 4C00h
int 21h
end Begin
Слайд 3

Ассемблер Intel 8086 Вывод строки. dosseg .model small .stack 200h .data

Ассемблер Intel 8086

Вывод строки.

dosseg
.model small
.stack 200h
.data
Msg db 'This text should appear

on the screen$' ; размещаем
;(в сегменте данных) выводимую строку, последний знак $ - ограничитель
;строки для DOS
.code
Begin:
mov ax,@Data
mov ds, ax
Mov ah,09 ; номер функции помещаем в ah
Lea dx,Msg ;смещение в сегменте до Msg помещаем в dx
Int 21h ; передаем управление DOS
mov ax, 4C00h
int 21h
end Begin
Слайд 4

Ассемблер Intel 8086 Ввод строки. dosseg .model small .stack 200h .data

Ассемблер Intel 8086

Ввод строки.

dosseg
.model small
.stack 200h
.data
Len = 256 ; пусть для

определенности строка не может превышать 256 байт
Str db Len dup (?) ; резервируем область памяти под вводимую
; строку (в сегменте данных)
.code
Begin:
mov ax,@Data
mov ds, ax
cr = 0dh ; присваиваем cr значение кода клавиши «Enter»
Mov cx,Len ; инициализируем счетчик цикла
Lea di,str ; устанавливаем di на начало области Str
M: Mov ah,01 ; номер функции помещаем в ah
Int 21h ; передаем управление DOS
Mov [di],al ; код введенного символа помещаем в очередной байт области Str
Cmp al,cr ; проверяем, не является ли полученный код кодом клавиши «Enter»
Je Ex ; если да – ввод завершен, выходим из цикла
Inc di ; продвигаем di к следующему байту Str
Loop M ; организуем цикл
Ex: ; при выходе из цикла cx содержит количество незаполненных байтов в Str
Mov [di],'$'
Mov ah,09 ; номер функции помещаем в ah
Lea dx,Str ;смещение в сегменте до Msg помещаем в dx
Int 21h ; передаем управление DOS
mov ax, 4C00h
int 21h
end Begin
Слайд 5

Ассемблер Intel 8086 Ввод строки. dosseg .model small .stack 200h .data

Ассемблер Intel 8086

Ввод строки.

dosseg
.model small
.stack 200h
.data
Str db 255, ?, 255 dup

(?),0dh,'$' ; резервируем область памяти под
; вводимую строку (в сегменте данных). Первый байт – максимальная длина
; строки, второй – фактическая длина (заполняется операционной системой
; в процессе ввода), далее – собственно строка символов
.code
Begin:
mov ax,@Data
mov ds, ax
Mov ah,0ah ; номер функции помещаем в ah
Lea dx,Str ;смещение в сегменте до Str помещаем в dx
Int 21h ; передаем управление DOS
Lea di,Str
Mov ch,0 ; инициализируем счетчик цикла
Mov cl,[di+1] ; инициализируем счетчик цикла
Lea si,Str ; устанавливаем si на начало области Str (на
; первый байт выводимой строки)
add si,2
M: Mov ah,02 ; номер функции помещаем в ah
Mov dl,[si] ; код выводимого символа помещаем в dl
Int 21h ; передаем управление DOS
Inc si ; продвигаем si к следующему символу (байту)
Loop M ; организуем цикл с меткой М
mov ax, 4C00h
int 21h
end Begin
Слайд 6

Ассемблер Intel 8086 Ввод-вывод чисел. Для ввода-вывода числовых данных операционная система

Ассемблер Intel 8086

Ввод-вывод чисел.

Для ввода-вывода числовых данных операционная
система не предоставляет

никаких возможностей, поэтому преобразование
вводимых символов в число и обратно полностью возлагается на программу.

Рассмотрим это преобразование на примере числа 6543 и десятичной системы счисления

Слайд 7

Ассемблер Intel 8086 Вывод беззнаковых чисел. dosseg .model small .stack 200h

Ассемблер Intel 8086

Вывод беззнаковых чисел.

dosseg
.model small
.stack 200h
.data
.code
UnsignedOut proc
xor cx,cx ;обнуляем счетчик

цифр
mov bx,10 ;в bx помещаем делитель(основание системы счисления)
m: inc cx ;считаем количество получающихся цифр
xor dx,dx ;преобразуем делимое к 32 разрядам
div bx ;получаем очередную цифру
push dx ;сохраняем ее в стеке
or ax,ax ;проверяем, есть ли еще цифры
jnz m ;если да – на метку m при выходе из цикла в стеке лежат цифры, в cx – их
;количество
m1: pop dx ;извлекаем цифру из стека
add dx,'0' ;преобразуем в код символа
mov ah,2 ;функцией 02 выводим на экран
int 21h
loop m1 ;повторяем cx раз
ret ;возвращаемся из процедуры
UnsignedOut endp
Begin:
mov ax,@Data
mov ds, ax
mov ax,7459
call UnsignedOut
mov ax, 4C00h
int 21h
end Begin
Слайд 8

Ассемблер Intel 8086 Вывод целых чисел. dosseg .model small .stack 200h

Ассемблер Intel 8086

Вывод целых чисел.

dosseg
.model small
.stack 200h
.data
.code
IntegerOut proc
xor cx,cx ;обнуляем счетчик

цифр
mov bx,10 ;в bx помещаем делитель
cmp ax,0 ;проверяем знак числа
jge m ;если неотрицательное – на m
neg ax ;иначе – меняем знак числа
push ax ;сохраняем число перед вызовом функции,
;использующей ax
mov ah,2 ;функцией 02 выводим знак '-'
mov dl,'-'
int 21h
pop ax ;восстанавливаем число в ax
m: inc cx ;считаем количество получающихся цифр
xor dx,dx ;преобразуем делимое к 32 разрядам
div bx ;получаем очередную цифру
push dx ;сохраняем ее в стеке
or ax,ax ;проверяем есть ли еще цифры
jnz m ;если да – на метку m
;при выходе из цикла в стеке лежат цифры, в cx – их
;количество
m1: pop dx ;извлекаем цифру из стека
add dx,'0' ;преобразуем в код символа
mov ah,2 ;функцией 02 выводим на экран
int 21h
loop m1 ;повторяем cx раз
ret ;возвращаемся из процедуры
IntegerOut endp

Begin:
mov ax,@Data
mov ds, ax
mov ax,-10519
call IntegerOut
mov ax, 4C00h
int 21h
end Begin

Слайд 9

Ассемблер Intel 8086 Ввод беззнаковых чисел. Ввод чисел сопровождается преобразованием строки

Ассемблер Intel 8086

Ввод беззнаковых чисел.

Ввод чисел сопровождается преобразованием строки символов в

число.
Данное преобразование производится получением последовательности цифр
из символов (вычитанием 48 – кода символа ’0’) и последующим сложением
цифр с соответствующими весами. Данная операция описывается формулой
(для числа из пяти цифр):
m=((((s1-48)*n+(s2-48))*n+(s3-48))*n+(s4-48))*n+(s5-48) , где
m – получаемое число,
n – основание системы счисления,
s1,s2,s3,s4,s5 – коды первого, второго, третьего, четвертого и пятого
символов строки соответственно.
Например строка ‘31562’ для десятичной системы счисления:
s1=51, s2=49, s3=53, s454=, s5=50
s1-48=3
(s1-48)*10+(s2-48)=31
((s1-48)*10+(s2-48))*10+(s3-48)=315
(((s1-48)*10+(s2-48))*10+(s3-48))*10+(s4-48)=3156
((((s1-48)*10+(s2-48))*10+(s3-48))*10+(s4-48))*10+(s5-48)=31562
Слайд 10

Ассемблер Intel 8086 Ввод беззнаковых чисел. UnsignedIn proc start: mov ah,0ah

Ассемблер Intel 8086

Ввод беззнаковых чисел.

UnsignedIn proc
start: mov ah,0ah ;функцией 0a вводим

строку символов и размещаем ее в
;области string
lea dx,string
int 21h
xor ax,ax ;обнуляем ax, в котором будем формировать число
lea si,string+2 ;устанавливаем si на первый символ введенной ;строки
;анализируем текущий символ
m2: cmp byte ptr [si],cr ;если это cr – строка закончилась, выходим
je ex
cmp byte ptr [si],'0';если код символа меньше кода '0' – ;это не цифра
jb err ;прыгаем на метку err
cmp byte ptr [si],'9';если код символа больше кода '9' – ;это не цифра
ja err ;прыгаем на метку err
mov bx,10 ;домножаем полученное число на основание ;системы счисления
mul bx
sub byte ptr [si],'0';вычитаем код символа '0' (получаем очередную цифру)
add al,[si] ;добавляем цифру к числу
adc ah,0
inc si ;продвигаем si к следующему символу
jmp m2 ;организуем цикл функцией 09 выводим сообщение об ошибке
err: lea dx,errmsg
mov ah,9
int 21h
jmp start ;повторяем ввод
ex: ret
UnsignedIn endp
Слайд 11

Ассемблер Intel 8086 Ввод беззнаковых чисел. dosseg .model small .stack 200h

Ассемблер Intel 8086

Ввод беззнаковых чисел.

dosseg
.model small
.stack 200h
.data
cr = 0dh ;cr присваиваем

значение кода символа возврата каретки (клавиши «Enter»)
lf = 0ah ;lf присваиваем значение кода символа перевода строки
string db 255, 0, 255 dup (?)
errmsg db 'Недопустимый символ, можно'
db 'использовать только цифры',cr,lf,'$'
.code
Begin:
mov ax,@Data
mov ds, ax
call UnsignedIn
call IntegerOut
mov ax, 4C00h
int 21h
end Begin
Слайд 12

Ассемблер Intel 8086 Ввод целых чисел. IntegerIn proc start: mov ah,0ah;функцией

Ассемблер Intel 8086

Ввод целых чисел.

IntegerIn proc
start: mov ah,0ah;функцией 0a вводим строку

символов и размещаем ее в области string
lea dx,string
int 21h
xor ax,ax ;обнуляем ax, в котором будем формировать число
lea si,string+2 ;устанавливаем si на первый символ введенной строки
mov negflag,ax ;обнуляем флаг отрицательности числа (предполагаем, что оно
;будет неотрицательным)
cmp byte ptr [si],'-';первый символ – это минус?
jne m2 ;если нет – на m2
not negflag ;отмечаем, что число отрицательное ;(negflag не равен 0)
inc si ;продвигаем si со знака числа к первой цифре
jmp m3 ;прыгаем на разбор строки цифр
m2: cmp byte ptr [si],'+';первый символ – это плюс?
jne m3 ;если нет – на m
inc si ;продвигаем si со знака числа к первой цифре
;анализируем текущий символ
Слайд 13

Ассемблер Intel 8086 Ввод целых чисел. m3: cmp byte ptr [si],cr

Ассемблер Intel 8086

Ввод целых чисел.

m3: cmp byte ptr [si],cr ;если это

cr – строка закончилась, выходим
;из цикла разбора ;символов
je ex1
cmp byte ptr [si],'0';если код символа меньше кода '0' – ;это не цифра
jb err ;прыгаем на метку err
cmp byte ptr [si],'9';если код символа больше кода '9' – ;это не цифра
ja err ;прыгаем на метку err
mov bx,10 ;домножаем полученное число на основание ;системы счисления
mul bx
sub byte ptr [si],'0';вычитаем код символа '0' (получаем очередную цифру)
add al,[si] ;добавляем цифру к числу
adc ah,0
inc si ;продвигаем si к следующему символу
jmp m3 ;организуем цикл функцией 09 выводим сообщение об ошибке
err: lea dx,errmsg
mov ah,9
int 21h
jmp start ;повторяем ввод
ex1: cmp negflag,0 ;число положительное?
je ex ;если да – выходим
neg ax ;меняем знак числа
ex: ret
IntegerIn endp