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