JMP SHORT @@L
@@R: ; return(0);
MOV AH, 4Ch
MOV AL, 0
INT 21h
; Макрос вывода символа на экран
PUTC MACRO CHAR
IFNB <CHAR>
MOV DL, CHAR
ENDIF
MOV AH, 2
INT 21h
ENDM
; Процедура вывода строки, адресуемой DI
PUTS PROC NEAR
PUSH DX
; Цикл посимвольного вывода строки
; for(;(_DL = *_DI) != ‘\0’; _DI++)
@@L: MOV DL, [DI]
CMP DL, 0
JE @@E
; putc(_DL);
PUTC
INC DI
JMP SHORT @@L
@@E: PUTC 13 ; Переход
PUTC 10 ; на новую строку
@@R: POP DX
RET
PUTS ENDP
END BEGIN
Формат строки листинга
<глубина> <номер_строки> <смещение> <машинный_код> <исходный_код>
Turbo Assembler Version 4.1 16/09/02 11:24:36 Page 1
mlec1.ASM
8 0000 .MODEL SMALL
9 0000 .STACK 200h
10 .386
11 LOCALS
12 ; Объявление данных
13 0000 .DATA
14 ; char *txt[]= {"", "ООО \"СОМ\"", "Ведущий программист", NULL};
15 0000 0008r 0014r 001Er + TXT DW S1, S2, S3, 0
16 0000
17 0008 88 A2 A0 AD AE A2 20+ S1 DB 'Иванов И.И.', 0
18 88 2E 88 2E 00
19 0014 8E 8E 8E 20 22 91 8E+ S2 DB 'ООО "СОМ"', 0
20 8C 22 00
21 001E 82 A5 A4 E3 E9 A8 A9+ S3 DB 'Ведущий программист',0
22 20 AF E0 AE A3 E0 A0+
23 AC AC A8 E1 E2 00
24
25 0032 .CODE
26 ; Макрос вывода символа DL на экран
27 ; Отмена вставки макроопределения \
27 PUTC MACRO CHAR
28 IFNB <CHAR>
29 MOV DL, CHAR
30 ENDIF
31 MOV AH, 2
32 INT 21h
33 ENDM
34
35 ;============== Программа ===================
36 0000 .CODE
37
38 0000 BEGIN: ; инициализация сегментного регистра
39 0000 B8 0000s MOV AX, @DATA
40 0003 8E D8 MOV DS, AX
41 ; инициализация задержки
42 ; s = txt;
43 0005 BE 0000r LEA SI, TXT ; Замена 8D->BE
44 0008 @@L: ; while(*s!= NULL) {
45 0008 83 3C 00 CMP WORD PTR [SI], 0
46 000B 74 0C 90 90 JE @@R
47 ; puts(*s)
48 000F 8B 3C MOV DI, [SI]
49 0011 E8 000B CALL PUTS
50 ; s++ }
51 0014 83 C6 02 ADD SI, 2
52 0017 EB EF JMP SHORT @@L
53 0019 @@R: ; return(0);
54 0019 B4 4C MOV AH, 4Ch
55 001B B0 00 MOV AL, 0
56 001D CD 21 INT 21h
57
Turbo Assembler Version 4.1 16/09/02 11:24:36 Page 2
lec1.ASM
58 ; Процедура вывода строки, адресуемой DI
59 001F PUTS PROC NEAR
60 001F 52 PUSH DX
61 ; Цикл посимвольного вывода строки
62 0020 8A 15 @@L: MOV DL, [DI]
63 0022 80 FA 00 CMP DL, 0
64 0025 74 09 90 90 JE @@E
65 PUTC
1 66 0029 B4 02 MOV AH, 2
1 67 002B CD 21 INT 21h
68 002D 47 INC DI
69 002E EB F0 JMP SHORT @@L
70 0030 @@E: PUTC 13 ; Переход
1 71 0030 B2 0D MOV DL, 13
1 72 0032 B4 02 MOV AH, 2
1 73 0034 CD 21 INT 21h
74 PUTC 10 ; на новую строку
1 75 0036 B2 0A MOV DL, 10
1 76 0038 B4 02 MOV AH, 2
1 77 003A CD 21 INT 21h
78 003C 5A @@R: POP DX
79 003D C3 RET
80
81 003E PUTS ENDP
84 END BEGIN
Turbo Assembler Version 4.1 16/09/02 11:24:36 Page 3
Symbol Table
Symbol Name Type Value
??DATE Text "16/09/02"
??FILENAME Text "lec1 "
??TIME Text "11:24:36"
??VERSION Number 040A
@32BIT Text 0
@@E Near _TEXT:0030
@@L Near _TEXT:0008
@@L Near _TEXT:0020
@@R Near _TEXT:0019
@@R Near _TEXT:003C
@CODE Text _TEXT
@CODESIZE Text 0
@CPU Text 0F0FH
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text LEC1
@INTERFACE Text 000H
@MODEL Text 2
@STACK Text DGROUP
@WORDSIZE Text 2
BEGIN Near _TEXT:0000
PUTS Near _TEXT:001F
S1 Byte DGROUP:0008
S2 Byte DGROUP:0014
S3 Byte DGROUP:001E
TXT Word DGROUP:0000
Macro Name
PUTC
Groups & Segments Bit Size Align Combine Class
DGROUP Group
STACK 16 0200 Para Stack STACK
_DATA 16 0032 Word Public DATA
_TEXT 16 003E Word Public CODE
Общая организация программы
Общий формат строки ассемблер-программы
[<метка>[:]][<оператор>[<операнд1>][,операнд2]][;комментарий]
Метка - последовательность символов из множества:
{0..9, a..z, A..Z,_,$,@,?}
Первый символ - "не цифра"
":" отделяет метку только от исполняемой команды
Явные объявления значений меток:
метка LABEL тип
Например, моделирование AX=<AH,AL>:
M_AX LABEL WORD
M_AL DB?
M_AH DB?
mov m_ax, 0 ; засылка 0 в слово m_ax
mov m_al, 3 ; засылка 3 в байт m_al
Явное присваивание значений меткам
метка EQU выражение
метка = выражение
Примеры:
MAXINT EQU 0FFFFh
NULL = 0
Выражение - связанная операторами совокупность чисел, меток,
строковых констант
Операторы: +,-,*,/,MOD - арифметические
AND, NOT, OR, XOR, SHL, SHR - логические и сдвиговые
EQ, GE, GT, LE, LT, NE - сравнение
() - выделение подвыражения
<> - строковая константа
Текущее значение счетчика адреса ассемблера - $
abc db 'строка текста'
LENabc = $ - abc
Управление программным счетчиком:
ORG выражение
Например:
ORG 100h ; назначение стартового адреса для сегмента кода,
; чтобы сделать программу типа COM
BUF LABEL BYTE
ORG $+50 ; зарезервировать 50 байт памяти в сегменте кода
Метка в MACRO-11 в отличие от ASM86 всегда отделяется двоеточием. Текущее значение счетчика размещения задается односимвольным именем ".". Для назначения нового значения всегда используется присваивание этому имени значения соответствующего выражения.
Например:
START: JMP BEGIN ; переход на начало программы
ABC: .BYTE 2, 5, 49. ; char abc[]={2,5,49}
ABC$LEN = .-ABC ; определить длину массива ABC
. = .+4 ; зарезервировать 4 байта
BEGIN:
MOV #5, R0
Константы в выражениях ассемблер-программ
Целые числа:
[знак]последовательность_цифр [признак_системы_счисления]
Признак СС: B -двоичная,
Q или O - восьмеричная,
D - десятичная,
H - шестнадцатеричная(если число начинается с цифр A..F, то впереди должна быть вставлена цифра 0).
Например:
42q, 00100010b, 22h, 34d, 34, 0A34h
По умолчанию в ASM86 считается обычно десятичная. В MACRO-11 - восьмеричная. Умалчиваемая система счисления может быть переопределена директивой .RADIX. Например:
.RADIX 8
Директивы объявления данных в ASM86
имя d* последовательность_выражений
d* Î {db, dw, dd, df, dq, dt}
Длина элементов : {1,2,4,6,8,10} байт соответственно.
Определение последовательности повторяющихся данных:
выражение1 DUP (выражение2)
ЕСЛИ выражение2 = ? , ТО это неинициализируемые данные
В MACRO-11 в основном используются такие директивы:
.BYTE последовательность_выражений ; размещение байтов
.WORD последовательность_выражений ; размещение слов
.BLKB выражение ; размещение блока байтов заданного размера
.BLKW выражение ; размещение блока слов заданного размера
.ASCII /строка_текста/ ; размещение строки
.ASCIZ /строка_текста/ ; размещение строки с дополнением байтом '\0'
Примеры(заполнить дома самостоятельно):
ASM86 | MACRO-11 |
char ch1, mch1[] = {1,-1,12}, mch2[10], s[]="STRING1", *ps = " STRING2" | |
CH1 | CH1: |
MCH1 | MCH1: |
sMCH2 | MCH2: |
S | S: |
PS | PS: |
short i1, mi1[5], mi2[]={1,2,3,4}, *pi = &mi1; | |
I1 | I1: |
MI1 | MI1: |
MI2 | MI2: |
PI | PI: |
Преобразование между внутренним и внешним представлением чисел
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


