.com файл выводящий сообщение
· Строка записывается в одинарных кавычках
· Используется функция 9 прерывания 21h
· Строка обрабатывается побайтно
;message
.model tiny
.code
org 100
Start jmp short main
;---DATA---------------------------
message db 'This is my first string in Assembler!!!$'
;---CODE---------------------------
main proc near
lea dx, message
mov ah,9
int 21h
main endp
end Start
Такая же программа в виде.ЕХЕ
;message_exe.asm
.model large
.stack 100h
.data
message db 'olololo Fuga the Best!$'
.code
Start proc far
;---Return---------------------
push ds
xor di,di
push di
;---Initialasing_SD------------
mov ax,@DATA
mov ds,ax
;---Print---------------------
lea dx,message
mov ah,9
int 21h
ret
Start endp
end Start
ВЫВОД ЦЕЛЫХ ЧИСЕЛ
Состоит из 2х этапов:
1. Преобразование внутреннего представления числа в строку символов
2. Вывод строки
Символы 0...9 кодируются в ASCII 30h...39h
Алгоритм преобразования целых 16-ти разрядных чисел со знаком. Он сводится к последовательному делению числа его внутреннего представления на константу 10, остатки преобразуются в символы и выводятся.
1. Исходное число поместить в ax
2. Очистить буфер вывода. Минимальная длина буфера вывода 6 символов
|
|
3. Проверка знака числа
4. Взятие модуля
5. Целочисленное без знаковое деление числа на 10
6. Остаток переводим в символьное представление. Остаток +'0'
7. Занести символьное представление остатка в буфер вывода
8. Проверить частное. Если!=0 перейти в 5
9. Если исходное число отрицательное занести в буфер символ ' - '
10. Завершение
Рассмотрим программные коды реализации шагов 3-9 этого алгоритма на примере числа -157
;...3
or ax,ax;старший бит в SF
;...4
neg ax
;...5
mov si,10
CLR_Dvd;начало цикла деления
xor dx,dx
div 157,si;частное <ax> <-15, остаток <dx><-7
;...6
add dx,'0';<dx> <-37h
;...7
dec bx
mov byte PTR[bx], dl
;...8
OR ax,ax
JNZ CLR_Dvd
;...9
dec bx
mov byte PTR[bx],'-'
Символ | ' ' | ' ' | '-' | '1' | '5' | '7' | '$' |
hex код | 2d |
.COM файл для вывода целых чисел
;Bin_ASCII -> преобразование строку в символы
;output -> Вывод строки символов на экран
.model tiny
.code
ORG 100h
Start: JMP Short main
;===DATA============
CR_LF db 0dh,0ah, '$'
L dw 6;длина буфера вывода
number dw 12345
in db 'Result:$'
outbuf db 11 dup(?),'$'
;===CODE============
main proc near
lea dx,in
call output
lea bx,outbuf
mov ax,number
call Bin_ASCII
lea dx,[bx];взятие адреса
;=====================
;<dx> начальный адрес строки которая выводится
output proc near
push ax
mov ah,9
int 21h
pop ax
ret
output endp
; procedure BIN_ASCII
; число выводимое на экран в регистре <AX>
; начальный адресс буфера вывода <bx>
;длина буфера вывода L
; фактическая длина буфера вывода <CX> <- L
Bin_ASCII proc near
push dx,si,ax
mov cx,L
Fill_buf:
;установка <bx> на хвост буфера вывода
mov Byte PTR [bx], '_'; очистка буфера вывода
inc bx
Loop Fill_buf
;================
mov si,10
or ax,ax
jns Clr_Dvd
neg ax
;================
clr_Dvd:
xor dx,dx
div 10
add dx,'0'
dec bx
mov Byte PTR [bx], dl
inc cx
or ax,ax
jnz Clr_Dvd
pop ax
or ax,ax
jns nomore
dec bx
mov Byte PTR [bx], '-'
inc cx
nomore:
pop si,dx
|
|
ret
Bin_ASCII endp
end start
ВВОД ИНФОРМАЦИИ С КЛАВИАТУРЫ
Любая информация с клавиатуры при использовании функции прерывании 21h вводится в символьном виде.
Основные функции воода для прерывания 21h
Функция | Операция | Доп. регистры | Вых. данные |
Ожид ввода с echo и ctrl+break | al Символ | ||
ожид без echo и crtl+break | al Символ | ||
без echo с ctrl+break | al Символ | ||
0ah | Чтение строки символов в буфер клавиатуры | <DS:DX> - адрес буфера. Первый байт длина буфера | Второй файт - фактическая длина. |
0bh | чтение сост клавиатуры | <al>=0ffh, буфер пуст <al>=0, буфер не пуст | |
0ch | Освобождение буфера клавиатуры и вывод нужной функции | <al> = номер функции |
ОРГАНИЗАЦИЯ ВВОДА СИМВОЛА И СТРОК В БУФЕР КЛАВИАТУРЫ
Одиночный символ можно ввести так, что бы он отображался при вводе (эхо) или был невидимым (не эхо) для этого используют функции 1,7,8. Рассмотрим пример процедуры с именем readkey которая осуществляет ожидание ввода символа без эхо сопровождения, что бы делать задержку перед закрытием консольного окна.
;READ_KEY
readkey proc
push ax
mov ah,8
int 21h
pop ax
readkey endp
;Шаблон вызова процедуры readkey из главной программы
pause db 'Press any key$'
;=======
main proc
...
lea dx,pause
call output
call readkey
...
ret
main endp
Если используется номер функции 0ah то символ или строка вводятся в буфер клавиатуры.
Пусть буфер клавиатуры имеет имя "буфер" и длину 30 байт
· buffer db 30, 31 dup(' '); 2 и остальные байты заполнены пробелами
· buffer LABEL byte
L db 30;максимальная длина буфера
actL db?;реальная длина буфера
field db 30 dup(?); поле буфера
В втором случае можно обращаться к буферу целиком по имени так и к отдельным его полям
Написать программу вода строки символов не более 10 и вывода ее на экран монитора. Для решения задачи необходимы 2 процедуры: вывод строки символов на экран монитора и ввод строки в буфер клавиатуры. Воспользуемся функцией 0ch и 0ah
;READSTRING
;BUFFER - БУФЕР КЛАВИАТУРЫ
;<СХ> - ФАКТИЧЕСКОЕ ФИСЛО ВВЕДЕНЫХ СИМВОЛОВ