3 ;---------------------------------------------------
4 0000 STACKSG SEGMENT PARA SACK 'Stack'
5 0000 20 [ DB 32 DUP(?)
6 ????
7 ]
8
9 0040 STACKSG ENDS
10 ;---------------------------------------------------
11 0000 DATASG SEGMENT PARA 'Data'
12 0000 00FA FLDA DW 250
13 0002 007D FLDB DW 125
14 0004 ???? FLDC DW ?
15 0006 DATASG ENDS
16 ;---------------------------------------------------
17 0000 CODESG SEGMENT PARA 'Code'
18 0000 BEGIN PROC FAR
19 ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:NOTHING
20 0000 1E PUSH DS ;Записать DS в стек
21 0001 2B C0 SUB AX,AX ;Записать в стек
22 0003 50 PUSH AX ; нулевой адрес
23 0004 B8 ---- R MOV AX,DATASG ;Поместить адрес DATASG
24 0007 8E D8 MOV DS,AX ; в регистр DS
25
26 0009 A1 0000 R MOV AX,FLDA ;Переслать 0250 в AX
27 000C 03 06 0002 R ADD AX,FLDB ;Прибавить 0125 к AX
28 0010 A3 0004 R MOV FLDC,AX ;Записать сумму в FLDC
29 0013 CB RET ;Вернуться в DOS
30 0014 BEGIN ENDP
31 0014 CODESG ENDS
END BEGIN

----------------------------------------------------------------------------
Segments and Groups:
N a m e Size Align Combine Class
CODESG . . . . . . . . . . . . 0014 PARA NONE 'CODE'
DATASG . . . . . . . . . . . . 0006 PARA NONE 'DATA'
STACKSG. . . . . . . . . . . . 0040 PARA STACK 'STACK'

Symbols:
N a m e Type Value Attr
BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0014
FLDA . . . . . . . . . . . . . L WORD 0000 DATASG
FLDB . . . . . . . . . . . . . L WORD 0002 DATASG
FLDC . . . . . . . . . . . . . L WORD 0004 DATASG
----------------------------------------------------------------------------








Ассемблер для IBM PC. Программы. 18



EXASM2 (EXE) Операции пересылки и сложения

Symbol Cross Reference (# is definition) Cref-1

BEGIN. . . . . . . . . . . . 18# 30 32

CODE . . . . . . . . . . . . 17
CODESG . . . . . . . . . . . 17# 19 31

DATA . . . . . . . . . . . . 11
DATASG . . . . . . . . . . . 11# 15 19 23

FLDA . . . . . . . . . . . . 12# 26
FLDB . . . . . . . . . . . . 13# 27
FLDC . . . . . . . . . . . . 14# 28

STACK. . . . . . . . . . . . 4
STACKSG. . . . . . . . . . . 4# 9 19

10 Symbols



































Ассемблер для IBM PC. Программы. 19



page 60,132
TITLE EXDEF (EXE) Определение данных
0000 DATASG SEGMENT PARA 'Data'

; Определение байта - DB:
; ----------------------
0000 ?? FLD1DB DB ? ;Неинициализирован
0001 50 65 72 73 6F 6E FLD2DB DB 'Personal Computer' ;Сим. строка
61 6C 20 43 6F 6D
70 75 74 65 72
0012 20 FLD3DB DB 32 ;Десятичная константа
0013 20 FLD4DB DB 20H ;Шест. константа
0014 59 FLD5DB DB 01011001B ;Двоичная константа
0015 01 4A 41 4E 02 46 FLD6DB DB 01,'JAN',02,'FEB',03,'MAR' ;Таблица
45 42 03 4D 41 52
0021 33 32 36 35 34 FLD7DB DB '32654' ;Символьные числа
0026 0A [ 00 ] FLD8DB DB 10 DUP(0) ;Десять нулей

; Определение слова - DW:
; ----------------------
0030 FFF0 FLD1DW DW 0FFF0H ;Шест. константа
0032 0059 FLD2DW DW 01011001B ;Двоичная константа
0034 0021 R FLD3DW DW FLD7DB ;Адресная константа
0036 0003 0004 0007 FLD4DW DW 3,4,7,8,9 ;Пять констант
0008 0009
0040 05 [ 0000 ] FLD5DW DW 5 DUP(0) ;Пять нулей

; Определение двойного слова - DD:
; -------------------------------
004A ???????? FLD1DD DD ? ;Неинициализировано
004E 43 50 00 00 FLD2DD DD 'PC' ;Символьная строка
0052 3C 7F 00 00 FLD3DD DD 32572 ;Десятичное значение
0056 11 00 00 00 FLD4DD DD FLD3DB - FLD2DB ;Разность адресов
005A 0E 00 00 00 31 00 FLD5DD DD 14,49 ;Две константы
00 00
; Определение учетверенного слова - DQ:
; ------------------------------------
0062 ???????????????? FLD1DQ DQ ? ;Неинициализировано
006A 47 4D 00 00 00 00 FLD2DQ DQ 04D47H ;Шест. константа
00 00
0072 3C 7F 00 00 00 00 FLD3DQ DQ 32572 ;Десятич. константа
00 00
; Определение десяти байт - DT:
; ----------------------------
007A ?????????????????? FLD1DT DT ? ;Неинициализировано
??
0084 43 50 00 00 00 00 FLD2DT DT 'PC' ;Символьная строка
00 00 00 00

008E DATASG ENDS
END
-----------------------------------------------------------------------------



Ассемблер для IBM PC. Программы. 20


Segments and Groups:
N a m e Size Align Combine Class
DATASG . . . . . . . . . . . . 008E PARA NONE 'DATA'

Symbols:
N a m e Type Value Attr
FLD1DB . . . . . . . . . . . . L BYTE 0000 DATASG
FLD1DD . . . . . . . . . . . . L DWORD 004A DATASG
FLD1DQ . . . . . . . . . . . . L QWORD 0062 DATASG
FLD1DT . . . . . . . . . . . . L TBYTE 007A DATASG
FLD1DW . . . . . . . . . . . . L WORD 0030 DATASG
FLD2DB . . . . . . . . . . . . L BYTE 0001 DATASG
FLD2DD . . . . . . . . . . . . L DWORD 004E DATASG
FLD2DQ . . . . . . . . . . . . L QWORD 006A DATASG
FLD2DT . . . . . . . . . . . . L TBYTE 0084 DATASG
FLD2DW . . . . . . . . . . . . L WORD 0032 DATASG
FLD3DB . . . . . . . . . . . . L BYTE 0012 DATASG
FLD3DD . . . . . . . . . . . . L DWORD 0052 DATASG
FLD3DQ . . . . . . . . . . . . L QWORD 0072 DATASG
FLD3DW . . . . . . . . . . . . L WORD 0034 DATASG
FLD4DB . . . . . . . . . . . . L BYTE 0013 DATASG
FLD4DD . . . . . . . . . . . . L DWORD 0056 DATASG
FLD4DW . . . . . . . . . . . . L WORD 0036 DATASG
FLD5DB . . . . . . . . . . . . L BYTE 0014 DATASG
FLD5DD . . . . . . . . . . . . L DWORD 005A DATASG
FLD5DW . . . . . . . . . . . . L WORD 0040 DATASG Length =0005
FLD6DB . . . . . . . . . . . . L BYTE 0015 DATASG
FLD7DB . . . . . . . . . . . . L BYTE 0021 DATASG
FLD8DB . . . . . . . . . . . . L BYTE 0026 DATASG Length =000A
-------------------------------------------------------------------------------


























Ассемблер для IBM PC. Программы. 21



D:\ D>DEBUG D:EXDEF.EXE
-D
1421:0000 00 50 65 72 73 6F 6E 61-6C 20 43 6F 6D 70 75 74 .Personal Comput
1421:0010 65 72 20 20 59 01 4A 41-4E 02 46 45 42 03 4D 41 er Y.JAN.FEB.MA
1421:0020 52 33 32 36 35 34 00 00-00 00 00 00 00 00 00 00 R32654..........
1421:0030 F0 FF 59 00 21 00 03 00-04 00 07 00 08 00 09 00 ..Y.!...........
1421:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 43 50 ..............CP
1421:0050 00 00 3C 7F 00 00 11 00-00 00 0E 00 00 00 31 00 ..<...........1.
1421:0060 00 00 00 00 00 00 00 00-00 00 47 4D 00 00 00 00 ..........GM....
1421:0070 00 00 3C 7F 00 00 00 00-00 00 00 00 00 00 00 00 ..<.............
-D
1421:0080 00 00 00 00 43 50 00 00-00 00 00 00 00 00 33 33 ....CP........33
1421:0090 3E 36 33 33 73 00 00 00-0A 0E 00 00 3E 63 63 30 >633s.......>cc0
1421:00A0 1C 06 63 63 3E 00 00 00-0A 0E 00 00 FF DB 99 18 ..cc>...........
1421:00B0 18 18 18 18 3C 00 00 00-0A 0E 00 00 63 63 63 63 ....<.......cccc
1421:00C0 63 63 63 63 3E 00 00 00-0A 0E 00 00 C3 C3 C3 C3 cccc>...........
1421:00D0 C3 C3 66 3C 18 00 00 00-0A 0E 00 00 C3 C3 C3 C3 ..f<............
1421:00E0 DB DB FF 66 66 00 00 00-0A 0E 00 00 C3 C3 66 3C ...ff.........f<
1421:00F0 18 3C 66 C3 C3 00 00 00-0A 0E 00 00 C3 C3 C3 66 .<f............f
-Q



































Ассемблер для IBM PC. Программы. 22



page 60,132
TITLE EXIMM (EXE) Пример непосредственных операндов
; (Кодируется для ассемблирования,
; но не для выполнения)
0000 DATASG SEGMENT PARA 'Data'
0000 ?? FLD1 DB ?
0001 ???? FLD2 DW ?
0003 DATASG ENDS

0000 CODESG SEGMENT PARA 'Code'
0000 BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG

; Операции пересылки и сравнения:
; ------------------------------
0000 BB 0113 MOV BX,275 ;Пересылка
0003 3C 19 CMP AL,H ;Сравнение

; Арифметические операции:
; -----------------------
0005 14 05 ADC AL,5 ;Сложение с переносом
0007 80 C7 0C ADD BH,12 ;Сложение
000A 1C 05 SBB AL,5 ;Вычитание с заемом
000C 80 2E 000 R 05 SUB FLD1,5 ;Вычитание

; Ротация и сдвиг (только на 1 бит):
; ---------------------------------
0011 D0 D3 RCL BL,1 ;Ротация влево с переносом
0013 D0 DC RCR AH,1 ;Ротация вправо с переносом
0015 D1 06 0001 R ROL FID2,1 ;Ротация влево
0019 D0 C8 ROR AL,1 ;отация вправо
001B D1 E1 SAL CX,1 ;Сдвиг влево
001D D1 FB SAR BX,1 ;Арифм. сдвиг вправо
001F D0 2E 0000 R SHR FLD1,1 ;Сдвиг вправо

; Логические операции:
; -------------------
0023 24 2C AND AL,00101100B ;AND (регистр)
0025 80 CF 2A OR BH,2AH ;OR (регистр)
0028 F6 C3 7A TEST BL,7AH ;TEST (регистр)
002B 80 36 0000 R 23 OR FLD1,23H ;XOR (память)
0030 BEGIN ENDP
0030 CODESG ENDS
END











Ассемблер для IBM PC. Программы. 23



page 60,132
TITLE XCOM1 COM-программа для пересылки и сложения
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP MAIN ;Обход через данные
; ---------------------------------------------------
FLDA DW 250 ;Определение данных
FLDB DW 125
FLDC DW ?
; ---------------------------------------------------
MAIN PROC NEAR
MOV AX,FLDA ;Переслать 0250 в AX
ADD AX,FLDB ;Прибавить 0125 к AX
MOV FLDC,AX ;Записать сумму в FLDC
RET ;ернуться в DOS
MAIN ENDP
CODESG ENDS
END BEGIN



page 60,132
TITLE EXJUMP (COM) Организация цикла с помощью JMP
0000 CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
0100 ORG 100H

0100 MAIN PROC NEAR
0100 B8 0001 MOV AX,01 ;Инициализация AX,
0103 BB 0001 MOV BX,01 ; BX,
0106 B9 0001 MOV CX,01 ; и CX
0109 A20:
0109 05 0001 ADD AX,01 ;Прибавить 01 к AX
010C 03 D8 ADD BX,AX ;Прибавить 01 к BX
010E D1 E1 SHL CX,1 ;Удвоить CX
0110 EB F7 JMP A20 ;Переход на A20
0112 MAIN ENDP
0112 CODESG ENDS
END MAIN















Ассемблер для IBM PC. Программы. 24



page 60,132
TITLE EXLOOP (COM) Организация цикла командой LOOP
0000 CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
0100 ORG 100H

0100 BEGIN PROC NEAR
0100 B8 0001 MOV AX,01 ;Инициализация AX,
0103 BB 0001 MOV BX,01 ; BX,
0106 BA 0001 MOV DX,01 ; и DX
0109 B9 000A MOV CX,10 ;Число циклов
010C A20:
010C 40 INC AX ;Прибавить 01 к AX
010D 03 D8 ADD BX,AX ;Прибавить AX к BX
010F D1 E2 SHL DX,1 ;Удвоить DX
0111 E2 F9 LOOP A20 ;Уменьшить CX и повторить
; цикл, если ненуль
0113 C3 RET ;Завершить работу
0114 BEGIN ENDP
0114 CODESG ENDS
END BEGIN




+-------------------------+
| CODESG SEGMENT PARA |
+-------------------------+
| BEGIN PROC FAR |
| . |
| . |
| CALL B10 |
| CALL C10 |
| RET |
| BEGIN ENDP |
+-------------------------+
| B10 PROC NEAR |
| . |
| . |
| RET |
| B10 ENDP |
+-------------------------+
| C10 PROC NEAR |
| . |
| . |
| RET |
| C10 ENDP |
+-------------------------+
| CODESG ENDS |
| END BEGIN |
+-------------------------+




Ассемблер для IBM PC. Программы. 25



TITLE CALLPROC (EXE) Вызов процедур
0000 STACKSG SEGMENT PARA STACK 'Stack'
0000 20 [ ???? ] DW 32 DUP(?)
0040 STACKG ENDS

0000 CODESG SEGMENT PARA 'Code'
0000 BEGIN PROC FAR
ASSUME CS:CODESG,SS:STACKSG
0000 1E PUSH DS
0001 2B C0 SUB AX,AX
0003 50 PUSH AX
0004 E8 0008 R CALL B10 ;Вызвать B10
; ...
0007 CB RET ;Завершить программу
0008 BEGIN ENDP
;--------------------------------------
0008 B10 PROC
0008 E8 000C R CALL C10 ;Вызвать C10
; ...
000B C3 RET ;Вернуться в
000C B10 ENDP ; вызывающую программу
;----------------------------------------------
000C C10 PROC
; ...
000C C3 RET ;Вернуться в
000D C10 ENDP ; вызывающую программу
;----------------------------------------------
000D CODESG ENDS
END BEGIN


























Ассемблер для IBM PC. Программы. 26



page 65,132
TITLE EXMOVE (EXE) Операции расширенной пересылки
;------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;------------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAME1 DB 'ABCDEFGHI'
NAME2 DB 'JKLMNOPQR'
NAME3 DB 'STUVWXYZ*'
DATASG ENDS
;-------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
CALL B10MOVE ;Вызвать JUMP подпрограмму
CALL C10MOVE ;Вызвать CALL подпрограмму
RET ;Завершить программу
BEGIN ENDP

; Расширенная пересылка (JUMP-подпрограмма),
; использующая переход по условию:
; -----------------------------------------
B10MOVE PROC
LEA SI,NAME1 ;Инициализация адресов
LEA DI,NAME2 ; NAME1 и NAME2
MOV CX,09 ;Переслать 9 символов
B20:
MOV AL,[SI] ;Переслать из NAME1
MOV [DI],AL ;Переслать в NAME2
INC SI ;Следующий символ в NAME1
INC DI ;Следующая позиция в NAME2
DEC CX ;Уменьшить счетчик цикла
JNZ B20 ;Счетчик > 0? Да - цикл
RET ;Если счетчик = 0, то
B10MOVE ENDP ; вернуться

; Расширенная пересылка (LOOP-подпрограмма),
; использующая команду LOOP:
; -----------------------------------------;
C10MOVE PROC
LEA SI,NAME2 ;Инициализация адресов
LEA DI,NAME3 ; NAME2 и NAME3
MOV CX,09 ;Переслать 9 символов
C20



Ассемблер для IBM PC. Программы. 27


MOV AL,[SI] ;Переслать из NAME2
MOV [DI],AL ;Переслать в NAME3
INC DI ;Следующий символ в NAME2
INC SI ;Следующая позиция в NAME3
LOOP C20 ;Уменьшить счетчик,
; если не ноль, то цикл
RET ;Если счетчик = 0, то
C10MOVE ENDP ; вернуться
CODESG ENDS
END BEGIN



TITLE CASE (COM) Перекодировка в заглавные буквы
0000 CODESG SEGMENT PARA 'CODE'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
0001 ORG 100H
0001 EB 1C 90 BEGIN: JMP MAIN
; -------------------------------------------
0003 43 68 61 6E 67 65 TITLEX DB 'Change to uppercase letters'
20 74 6F 20 75 70
70 65 72 63 61 73
65 20 6C 65 74 74
65 72 73
; -------------------------------------------
011E MAIN PROC NEAR
011E 8D 1E 0104 R LEA BX,TITLEX+1 ;Адрес первого символа
0122 B9 001F MOV CX,31 ;Число символов
0125 B20:
0125 8A 27 MOV AH,[BX] ;Символ из TITLEX
0127 80 FC 61 CMP AH,61H ;Это
012A 72 0A JB B30 ; прописная
012C 80 FC 7A CMP AH,7AH ; буква
012F 77 05 JA B30 ; ?
0131 80 E4 DF AND AH,11011111B ;Да - преобразовать
0134 88 27 MOV [BX],AH ;Записать в TITLEX
0136 B30:
0136 43 INC BX ;Следующий символ
0137 E2 EC LOOP B20 ;Повторить цикл 31 раз
0139 C3 RET
013A MAIN ENDP
013A CODESG ENDS
END BEGIN













Ассемблер для IBM PC. Программы. 28



page 60,132
TITLE ALLASC (COM) Вывод на экран ASCII-символов 00-FF
CODESC SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:NOTHING
ORG 100H
BEGIN: JMP SHORT MAIN
CTR DB 00,'S'

; Основная процедура:
; ------------------
MAIN PROC NEAR
CALL B10CDR ;Очистить экран
CALL C10SET ;Установить курсор
CALL D10DISP ;Вывести символ на экран
RET
MAIN ENDP
; Очистка экрана:
; --------------
B10CLR PROC
MOV AX,0600H
MOV BH,07
MOV CX,0000 ;Левая верхняя позиция
MOV DX,184FH ;Правая нижняя позиция
INT 10H
RET
B10CLR ENDP
; Установка курсора в 00,00:
; -------------------------
C10SET PROC
MOV AN,02
MOV BN,00
MOV DX,0000
INT 10H
RET
C10SET ENDP
; Вывод на экран ASCII символов:
; -----------------------------
D10DISP PROC
MOV CX,256 ;256 итераций
LEA DX,CTR ;Адрес счетчика
D20
MOV AH,09 ;Функция вывода символа
INT 21H
INC CTR ;Увеличить счетчик
LOOP D20 ;Уменьшить CX,
; цикл, если не ноль
RET ;Вернуться
D10DISP ENDP

CODESG ENDS
END BEGIN




Ассемблер для IBM PC. Программы. 29



page 60,132
TITLE CTRNAME (EXE) Ввод имен и вывод в центр экрана
;--------------------------------------------------------
STSCKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;--------------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ;Имя списка параметров:
MAXNLEN DB 20 ; макс.длина имени
NAMELEN DB ? ; число введенных символов
NAMEFLD DB 20 DUP(' '),'$' ; имя и ограничитель
; для вывода на экран
PRIMPT DB 'Name? ', '$'
DATASG ENDS
;--------------------------------------------------------
CODESG SEGMENT PARA 'Code"
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASC
PUSH DS
SUB AX,AX
PUCH AX
MOV AX,DATASC
MOV DS,AX
MOV ES,AX
CALL Q10CLR ;Очистить экран
A20LOOP:
MOV DX,0000 ;Установить курсор в 00,00
CALL Q20CURS
CALL B10PRMP ;Выдать текст запроса
CALL D10INPT ;Ввести имя
CALL Q10CLR ;Очистить экран
CMP NAMELEN,00 ;Имя введено?
JE A30 ; нет - выйти
CALL E10CODE ;Установить звуковой сигнал
; и ограничитель '$'
CALL F10CENT ;Центрирование и вывод
JMP A20LOOP
A30:
RET ;Вернуться в DOS
BEGIN ENDP
; Вывод текста запроса:
; --------------------
B10PRMP PROC NEAR
MUV AN,09 ;Функция вывода на экран
LEA DX,PROMPT
INT 21H
RET
B10PRMP ENDP
; Ввод имени с клавиатуры:
; -----------------------
D10INPT PROC NEAR



Ассемблер для IBM PC. Программы. 30


MOV AN,0AN ;Функция ввода
LEA DX,NAMEPAR
INT 21H
RET
D10INPT ENDP
; Установка сигнала и ограничителя '$':
; ------------------------------------
E10CODE PROC NEAR
MOV BN,00 ;Замена символа Return (0D)
MOV BL,NAMELEN ; на зв.сигнал (07)
MOV NAMEFLD[BX],07
MOV NAMEFLD[BX+1],'$' ;Установить ограничитель
RET
E10CODE ENDP
; Центрирование и вывод имени на экран:
; ------------------------------------
F10CENT PROC NEAR
MOV DL,NAMELEN ;Определение столбца:
SHR DL,1 ; разделить длину на 2,
NEG DL ; поменять знак,
ADD DL,40 ; прибавить 40
MOV DH,12 ;Центральная строка
CALL Q20CURS ;Установить курсор
MOV AN,09
LEA DX,NAMEFLD ;Вывести имя на экран
INT 21H
RET
F10CENT ENDP
; Очистить экран:
; --------------
Q10CLR PROC NEAR
MOV AX,0600H ;Функция прокрутки экрана
MOV BH,30 ;Цвет (07 для ч/б)
MOV CX,0000 ;От 00,00
MOV DX,184FH ;До 24,79
INT 10H ;Вызов BIOS
RET
Q10CLR
; Установка курсора (строка/столбец):
; ----------------------------------
Q20CURS PROC NEAR ;DX уже установлен
MOV AH,02 ;Функция установки курсора
MOV BH,00 ;Страница #0
INT 10H ;Вызов BIOS
RET
Q20CURS ENDP

CODESG ENDS
END BEGIN







Ассемблер для IBM PC. Программы. 31



page 60,132
TITLE NMSCROLL (EXE) Инвертирование, мигание, прокрутка
; -------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKG ENDS
; -------------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ;Имя списка параметров:
MAXNLEN DB 20 ; макс.длина имени
ACTNLEN DB ? ; число введенных символов
NAMEFLD DB 20 DUP(' ') ; имя

COL DB 00
COUNT DB ?
PROMPT DB 'Name? '
ROW DB 00
DATASG ENDS
; -------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH DS
MOV AX,DATASG
MOV ES,AX
MOV AX,0600H
CALL Q10CLR ;Очистить экран
A20LOOP:
MOV COL,00 ;Установить столбец 0
CALL Q20CURS
CALL B10PRMP ;Выдать текст запроса
CALL D10INPT ;Ввести имя с клавиатуры
CMP ACTNLEN,00 ;Нет имени? (т.е. конец)
JNE A30
MOV AX,0600H
CALL Q10CLR ;Если да, то очистить экран,
RET ; и завершить программу
A30:
CALL E10NAME ;Вывести имя на экран
JMP A20LOOP
BEGIN ENDP
; Вывод текста запроса:
; --------------------
B10PRMP PROC NEAR
LEA SI,PROMPT ;Адрес текста
MOV COUNT,05
B20:
MOV BL,70H ;Видеоинверсия



Ассемблер для IBM PC. Программы. 32


CALL F10DISP ;Подпрограмма вывода
INC SI ;Следующий символ в имени
INC COL ;Следующий столбец
CALL Q20CURS
DEC COUNT ;Уменьшение счетчика
JNZ B20 ;Повторить n раз
RET
B10PRMP ENDP
; вод имени с клавиатуры:
; ----------------------
D10INPT PROC NEAR
MOV AN,0AH
LEA DX,NAMEPAR
INT 21H
RET
D10INPT ENDP
; Вывод имени с миганием и инверсией:
; ----------------------------------
E10NAME PROC NEAR
LEA SI,NAMEFLD ;Адрес имени
MOV COL,40 ;Установить столбец
E20:
CALL Q20CURS ;Установить курсор
MOV BL,0FOH ;Мигание и инверсия
CALL F10DISP ;Подпрограмма вывода
INS SI ;Следующий символ в имени
INS COL ;Следующий столбец на экране
DES ACTNLEN ;Уменьшить счетчик длины
JNZ E20 ;Циклить n раз
CMP ROW,20 ;Последняя строка экрана?
JAE E30 ; нет
INC ROW
RET
E30: MOV AX,0601H ; да --
CALL Q10CLR ; очистить экран
RET
E10NAME ENDP
; Вывод символа на экран:
; ----------------------
F10DISP PROC NEAR ;BL (атрибут) уже установлен
MOV AN,09 ;Функция вывода на экран
MOV AL,[SI] ;Получить символ из имени
MOV BH,00 ;Номер страницы
MOV CX,01 ;Один символ
INT 10H ;Вызов BIOS
RET
F10DISP ENDP
; Очистка экрана:
; --------------
Q10CLR PROC NEAR ;AX установлен при вызове
MOV BH,07 ;Нормальный ч/б
MOV CX 0000
MOV DX,184FH



Ассемблер для IBM PC. Программы. 33


INT 10H ;Вызов BIOS
RET
Q10CLR ENDP
; Установить курсор (строка/столбец):
; ----------------------------------
Q20CURS PROC NEAR
MOV AN,02
MOV BH,00
MOV DH,ROW
MOV DL,COL
INT 10H
RET
Q20CURS ENDP
CODESG ENDS
END BEGIN



Расширенная функция Скэн-код

Alt/A до Alt/Z 1E - 2C
F1 до F10 3B - 44
Home 47
Стрелка вверх 48
PgUp 49
Стрелка влево 4B
Стрелка вправо 4D
End 4F
Стрелка вниз 50
PgDn 51
Ins 52
Del 53
























Ассемблер для IBM PC. Программы. 34



TITLE GRAPHIX (COM) Пример цвета и графики
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H

MAIN PROC NEAR
MOV AN,00 ;Установка режима графики
MOV AL,0DH ; для EGA (CGA=04)

MOV AH,0BH ;Установить палитру
MOV BH,00 ;Фон
MOV BL,02 ;Зеленый
INT 10H

MOV BX,00 ;Начальные цвет,
MOV CX,00 ; столбец
MOV DX,00 ; и строка
A50:
MOV AH,0CH ;Функция вывода точки
MOV AL,BL ;Установить цвет
INT 10H ;BX, CX, и DX сохраняются
INC CX ;Увеличить столбец
CMP CX,320 ;Столбец 320?
JNE A50 ; нет - цикл,
MOV CX,00 ; да - сбросить столбец
INS BL ;Изменить цвет
INS DX ;Увеличить строку
CMP DX,40 ;Строка 40?
JNE A50 ; нет - цикл,
RET ; да - завершить
MAIN ENDP
CODESG ENDS
END MAIN






















Ассемблер для IBM PC. Программы. 35



page 60,132
TITLE STRING (EXE) Проверка строковых операций
; ---------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKG ENDS
; ---------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAME1 DB 'Assemblers' ;Элементы данных
NAME2 DB 10 DUP(' ')
NAME3 DB 10 DUP(' ')
DATASG ENDS
; ---------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR ;Основная процедура
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
CALL C10MVSB ;Подпрограмма MVSB
CALL D10MVSW ;Подпрограмма LODS
CALL E10LODS ;Подпрограмма LODS
CALL F10STOS ;Подпрограмма CMPS
CALL H10SCAS ;Подпрограмма SCAS
RET
BEGIN ENDP
; Использование MOVSB:
; -------------------
C10MVSB PROC NEAR
CLD
LEA SI,NAME1
LEA D1,NAME2
MOV CX,10 ;Переслать 10 байтов
REP MOVSB ; из NAME1 в NAME2
RET
C10MVSB ENDP
; Использование MOVSW:
; -------------------
D10MVSW PROC NEAR
CLD
LEA SI,NAME2
LEA DI,NAME3
MOV CX,05 ;Переслать 5 слов
REP MOVSW ; из NAME2 в NAME3
RET
D10MVSW ENDP
; Использование LODSW:
; -------------------
E10LODS PROC NEAR



Ассемблер для IBM PC. Программы. 36


CLD
LEA SI,NAME1 ;Загрузить первое слово
LODSW ; из NAME1 в AX
RET
E10LODS ENDP
; Использование STOSW:
; -------------------
F10STOS PROC NEAR
CLD
LEA D1,NAME3
MOV CX,05
MOV AX,2020H ;Переслать пробелы
REP STOSW ; в NAME3
RET
F10STOS ENDP
; Использование CMPSB:
; -------------------
G10CMPS PROC NEAR
CLD
MOV CX,10
LEA SI,NAME1
LEA DI,NAME2
REPE CMPSB ;Сравнить NAME1 и NAME2
JNE G20 ;Не равны?
MOV BH,01

G20: MOV CX,10
LEA SI,NAME2
LEA DI,NAME3
REPE CMPSB ;Сравнить NAME2 и NAME3
JE G30 ;Если равны, то выйти
MOV BL,02
G30: RET
G10CMPS ENDP

; Использование SCASB:
; -------------------
H10SCAS PROC NEAR
CLD
MOV CX,10
LEA DI,NAME1
MOV AL,'m' ;Поиск символа 'm'
REPNE SCASB ; в NAME1
JNE H20 ;Если не найден - выйти
MOV AH,03
H20: RET
H10SCAS ENDP

CODES ENDS
END BEGIN






Ассемблер для IBM PC. Программы. 37



page 60,132
TITLE EXRING (COM) Вывод имен, выровненных справа
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
;--------------------------------------------------------
NAMEPAR LABEL BYTE ;Имя списка параметров
MAXNLEN DB 31 ;Макс. длина
ACTNLEN DB ? ;Число введенных символов
NAMEFLD DB 31 DUP(' ') ;Имя

PROMPT DB 'Name?', '$'
NAMEDSP DB 31 DUP(' '), 13, 10, '$'
ROW DB 00
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
MOV AX,0600H
CALL Q10SCR ;Очистить экран
SUB DX,DX ;Установить курсор в 00,00
CALL Q20CURS
A10LOOP:
CALL B10INPT ;Ввести имя с клавиатуры
TEST ACTNLEN,0FFH ;Нет имени? (т.е. конец)
JZ A90 ; да - выйти
CALL D10SCAS ;Найти звездочку
CMP AL,'*' ;Найдена?
JE A10LOOP ; да - обойти
CALL E10RGHT ;Выровнять имя справа
CALL A10LOOP
A90: RET
MAIN ENDP
; Вывод запроса для ввода имени:
; -----------------------------
B10INPT PROC
MOV AH,09
LEA DX,PROMPT ;Выдать текст запроса
INT 21H
RET
B10INPT ENDP
; Поиск звездочки в имени:
; -----------------------
D10SCAS PROC
CLD
MOV AL,'*'
MOV CX,30 ;Длина сканирования - 30
LEA DI,NAMEFLD
REPNE SCASB ;Звездочка найдена?
JE D20 ; да - выйти,
MOV AL,20H ; нет стереть * в AL
D20: RET
D10SCAS ENDP



Ассемблер для IBM PC. Программы. 38


; Выравнивание справа и вывод на экран:
; ------------------------------------
E10RGHT PROC
STD
SUB CH,CH
MOV CL,ACTNLEN ;Длина в CX для REP
LEA SI,NAMEFLD ;Вычислить самую правую
ADD SI,CX ; позицию
DEC SI ; введенного имени
LEA DI,NAMEDSP+30 ;Правая поз. поля имени
REP MOVSB ;Переслать справа налево
MOV DH,ROW
MOV DL,48
CALL Q20CURS ;Установить курсор
MOV AH,09
LEA DX,NAMEDSP ;Выдать имя на экран
INT 21H
CMP ROW,20 ;Последняя строка экрана?
JAE E20 ; нет -
INC ROW ; увеличить строку,
JMP E90
E20:
MOV AX,0601H ; да -
CALL Q10SCR ; прокрутить и
MOV DH,ROW ; установить курсор
MOV DL,00
CALL Q20CURS
E90: RET
E10RGHT ENDP
; Очистить область имени:
; ----------------------
F10CLNM PROC
CLD
MOV AX,2020H
MOV CX,15 ;Очистить 15 слов
LEA DI,NAMEDSP
REP STOSW
RET
F10CLNM ENDP
; Прокрутка экрана:
; ----------------
Q10SCR PROC ;AX установлен при вызове
MOV BH,30 ;Цвет ( 07 для ч/б)
MOV CX,00
MOV DX,184FH
INT 10H
RET
Q10SCR ENDP
; Установить курсор (строка/столбец):
; ----------------------------------
Q20CURS PROC ;DX установлен при вызове
MOV AH,02
SUB BH,BH



Ассемблер для IBM PC. Программы. 39


INT 10H
RET
Q20CURS ENDP
CODESG ENDS
END BEGIN



















































Ассемблер для IBM PC. Программы. 84



TITLE EXDWMUL - Умножение двойных слов
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
; ---------------------------------------------
MULTCND DW 3206H ;Элементы данных
DW 2521H
MULTPLR DW 6400H
DW 0A26H
PRODUCT DW 0
DW 0
DW 0
DW 0
; ---------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL E10XMUL ;Вызвать 1-е умножение
CALL Z10ZERO ;Очистить произведение