Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
15.04.2015
Размер:
1.15 Mб
Скачать

1 ;Программа преобразования двузначного шестнадцатеричного числа

2 ;из символьного представления в двоичное

3 ;Результат преобразования будет в регистре bl

4 ;Вводить цифры или прописные буквы: A,B,C,D,E,F !!!

5

6 0000 data segment para public 'data' ;Определяем сегмент данных

7 0000 82 A2 A5 A4 A8 E2 A5+ mes1 db 'Введите первую цифру $'

8 20 AF A5 E0 A2 E3 EE+

9 20 E6 A8 E4 E0 E3 20+

10 20 24

11 0017 82 A2 A5 A4 A8 E2 A5+ mes2 db 'Введите вторую цифру $'

12 20 A2 E2 AE E0 E3 EE+

13 20 E6 A8 E4 E0 E3 20+

14 20 24

15 002E data ends

16

17 0000 stk segment stack 'stack' ; Определяем сегмент стека

18 0000 0100*(3F) db 256 dup('?')

19 0100 stk ends

20

21 0000 code segment 'code' ;Начало сегмента кода

22 0000 main proc

23 assume cs:code, ds:data, ss:stk

24 0000 B8 0000s mov ax,data

25 0003 8E D8 mov ds,ax

26 0005 B4 09 mov ah,9h ;Выводим на экран

27 0007 BA 0000r mov dx,offset mes1 ;строку

28 000A CD 21 int 21h ; mes1

29 000C 33 C0 xor ax,ax ;Очистим регистры ax

30 000E 33 DB xor bx,bx ; и bx

31 0010 B4 01 mov ah,1h ;Ввод с клавиатуры

32 0012 CD 21 int 21h ;первой цифры (загружается в регистр al)

33

34 0014 2C 30 sub al,30h ;Вычитаем из al число 30h

35 0016 3C 09 cmp al,9h ;Сравниваем результат с 9h

36 0018 7E 02 jle m1 ;Если меньше или равно, то на метку m1

37 001A 2C 07 sub al,7h ;Иначе - вычитаем из al число 7h

38 001C m1:

39 001C 02 1E 0000 add bl,a1 ; Загружаем в bl первое число

**Error** Prog.asm(33) Undefined symbol: A1

40 0020 D1 E3 D1 E3 D1 E3 D1+ shl bx,4h ;Сдвигаем содержимое bx на 4

; разряда влево

41 E3

42

43 0028 B4 09 mov ah,9h ; Выводим на экран

44 002A BA 0017r mov dx,offset mes2 ; строку

45 002D CD 21 int 21h ; mes2

46

47 002F B4 01 mov ah,1h ;Ввод с клавиатуры

48 0031 CD 21 int 21h ;второй цифры

49

50 0033 2C 00 sub al,300h ;Повторение

**Error** Prog.asm(43) Constant too large

51 0035 3C 09 cmp al,9h ;проверки

52 0037 7E C7 jle m2 ;кода

**Error** Prog.asm(45) Undefined symbol: M2

53 0039 2C 07 sub al,7h ;ASCII

54 003B m22:

55 003B 02 D8 add bl,al ;Загружаем в bl второе число

56

57 003D B8 4C00 mov ax, 4c00h ;Выход

58 0040 CD 21 int 21h ; в систему

59 0042 main endp

60 0042 code ends ;Окончание сегмента кода

61 end main

Symbol Name Type Value Cref (defined at #)

??DATE Text "13/09/09"

??FILENAME Text "Prog "

??TIME Text "15:10:55"

??VERSION Number 030A

@CPU Text 0101H

@CURSEG Text CODE #6 #17 #21

@FILENAME Text PROG

@WORDSIZE Text 2 #6 #17 #21

M1 Near CODE:001C 36 #38

M22 Near CODE:003B #54

MAIN Near CODE:0000 #22 61

MES1 Byte DATA:0000 #7 27

MES2 Byte DATA:0017 #11 44

Groups & Segments Bit Size Align Combine Class Cref (defined at #)

CODE 16 0042 Para none CODE #21 23

DATA 16 002E Para Public DATA #6 23 24

STK 16 0100 Para Stack STACK #17 23

**Error** Prog.asm(33) Undefined symbol: A1

**Error** Prog.asm(43) Constant too large

**Error** Prog.asm(45) Undefined symbol: M2

Файл листинга содержит, в частности, код ассемблера исходной программы. Но в листинге приводится расширенная информация об этом коде. Для каждой команды ассемблера указываются её машинный (объектный) код и смещение в кодовом сегменте.

Кроме того, в конце листинга TASM формирует таблицы, которые содержат информацию о метках и сегментах, используемых в программе, а также информацию о размерах и других параметрах сегментов кода, данных и стека.

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

Строки в файле листинга имеют следующий формат:

<глубина_вложенности> <номер_строки> <смещение> <машинный_код> <исходный код>

Здесь:

  • <глубина_вложенности> - уровень вложенности включаемых файлов или макрокоманд в файле;

  • <номер_строки> - номер строки в файле листинга. Этим номера используются для локализации ошибок и форматирования таблицы перекрестных ссылок. Помните, что эти номера могут не соответствовать номерам строк в исходном файле.

В добавлении к вышесказанному нужно отметить, что ассемблер имеет директиву INCLUDE, которая позволяет включить в данный файл строки другого файла. Нумерация при этом как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения <глубина_вложенности> на единицу. Это замечание касается и использования макрокоманд;

  • <смещение> - смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Смещение вычисляет транслятор для адресации в сегменте кода;

  • <машинный_код> - машинное представление команд ассемблера,

  • <исходный_код> - строка кода из исходного файла.

Дальнейшие действия зависят от характера ошибки.

Исправлять ошибки следует в исходном файле с расширением asm. Исправив несколько первых ошибок (если они есть), перетранслируйте программу и приступайте к устранению следующих ошибок. Возможно, что это делать не придётся, так как после исправления одной ошибки могут исчезнуть и последующие (так называемые наведенные ошибки).

О нормальном окончании процесса трансляции можно судить по сообщению TASM, в котором отсутствуют строки с сообщениями об ошибках и предупреждениях.

Изучая внимательно файл листинга, вы, наверное, заметили, что не все строки исходной программы имеют соответствующий <машинный_код>. Это обстоятельство обусловлено тем, что исходный файл на ассемблере в общем случае может содержать конструкции следующих типов:

  1. команды ассемблера — конструкции, которым соответствуют машинные команды;

  2. директивы ассемблера — конструкции, которые не генерируют машинных команд, а являются указаниями транслятору на выполнение некоторых действий или служат для задания режима его работы;

  3. макрокоманды конструкции, которые, будучи представлены одной строкой в исходном файле программы, после обработки транслятором генерируют в объектном модуле последовательность команд, директив или макрокоманд ассемблера.

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