Для работы с символами в ассемблере применяется таблица ASCII (полностью в конце статьи). ASCII представляет таблицу кодировки символов, в которой каждому символу соответствует определенное число. Например, латинской букве A соответствует число 65, а букве B - число 66. Более того цифровые символы имеет свои собственные числовые коды. Например, символу 0 соответствует число 48, символу 1 - число 49 и т.д. Каждый отдельный символ из таблицы ASCII представляет 1 байт. Если мы работаем с символами, которые отсутствуют в этой таблице, например, с кириллическими символами, то размер одного символа будет больше. Так, один кириллический символ занимает два байта.
В коде ассемблера строка - набор символов заключается в двойный кавычки, а отдельный символ помещается в одинарные кавычки. Например, поместим в регистр X0 символ "D":
MOV X0, #'D'
Однако фактически в регистр X0 помещается числовой код этого символа из таблицы ASCII - число 68. Мы можем это увидеть, получив код возврата из программы
.global _start _start: MOV X0, #'D' MOV X8, #93 SVC 0
Перед символом указан символ решетки #, однако в принципе можно его и не использовать:
MOV X0, 'D'
Аналогично мы можем проводить арифметические действия с символами, при этом будут использовать числовые коды символов:
MOV X0, 2 ADD X0, X0, #'D' // X0 = X0 + 'D' = 2 + 68 = 70
Здесь к содержимому регистра X0 добавляется числовой код символа "D".
То же самое касается и других операций, например, вычитания:
MOV X0, 200 SUB X0, X0, #'D' // X0 = X0 - 'D' = 200 - 68 = 132
Есть специальные непечатаемые символы, так называемые, эскейп-последовательности:
\b: символ Backspace (удаление предыдущего символа) (ASCII-код 8)
\f: символ Form feed (переход на следующую страницу) (ASCII-код 12)
\n: переход на новую строку (ASCII-код 10)
\r: возврат каретки (ASCII-код 13)
\t: табуляция (ASCII-код 9)
\ddd: восьмеричный код ASCII
\xdd: шестнадцатеричный код ASCII
\: экранизация символа \
\": экранизация символа "
Хранить символы с программе можно в виде строки, определяя данные с помощью директив .ascii и .asciz:
.data message1: .ascii "Hello METANIT.COM\n" message2: .asciz "Hello World\n"
То есть фактически строка представляет набор числовых символов из таблицы ASCII. Директива .asciz
кроме того добавляет к строке нулевой байт, который служит признаком окончания строки.
Если же надо хранить отдельные символы, то можно использовать числовые типы, например, .byte:
.data chars: .byte 68, 'D', 'F' - 2
Здесь определено три байта, и все они равны одному и тому же значению - числу 68, которое эквивалентно символу 'D'. В третьем случае для получаения значения выполняется выражение, при котором от числового кода символа 'F' вычитается число 2.
Первые 31 символов - управляющие последовательности.
DEC | HEX | BIN | Символ | Описание |
0 | 00 | 00000000 | NUL | Ноль/нулевой байт |
1 | 01 | 00000001 | SOH | Начало заголовка |
2 | 02 | 00000010 | STX | Начало текста |
3 | 03 | 00000011 | ETX | Конец текста |
4 | 04 | 00000100 | EOT | Конец передачи |
5 | 05 | 00000101 | ENQ | запрос |
6 | 06 | 00000110 | ACK | Подтверждение |
7 | 07 | 00000111 | BEL | Сигнал/звонок |
8 | 08 | 00001000 | BS | Шаг назад |
9 | 09 | 00001001 | HT | Горизонтальная табуляция |
10 | 0A | 00001010 | LF | Перевод строки |
11 | 0B | 00001011 | VT | Вертикальная табуляция |
12 | 0C | 00001100 | FF | Новая страница |
13 | 0D | 00001101 | CR | Возврат каретки |
14 | 0E | 00001110 | SO | Выключить сдвиг |
15 | 0F | 00001111 | SI | Включить сдвиг |
16 | 10 | 00010000 | DLE | Ключ связи данных |
17 | 11 | 00010001 | DC1 | Управиление устройством 1 |
18 | 12 | 00010010 | DC2 | Управиление устройством 2 |
19 | 13 | 00010011 | DC3 | Управиление устройством 3 |
20 | 14 | 00010100 | DC4 | Управиление устройством 4 |
21 | 15 | 00010101 | NAK | Отрицательное подтверждение |
22 | 16 | 00010110 | SYN | Синхронизация |
23 | 17 | 00010111 | ETB | Конец передаваемого блока |
24 | 18 | 00011000 | CAN | Отмена |
25 | 19 | 00011001 | EM | Конец среды |
26 | 1A | 00011010 | SUB | Замена |
27 | 1B | 00011011 | ESC | Выход |
28 | 1C | 00011100 | FS | Разделитель файлов |
29 | 1D | 00011101 | GS | Разделитель групп |
30 | 1E | 00011110 | RS | Разделитель записей |
31 | 1F | 00011111 | US | Разделитель модулей |
Печатные символы
DEC | HEX | BIN | Символ |
32 | 20 | 00100000 | пробел |
33 | 21 | 00100001 | ! |
34 | 22 | 00100010 | " |
35 | 23 | 00100011 | # |
36 | 24 | 00100100 | $ |
37 | 25 | 00100101 | % |
38 | 26 | 00100110 | & |
39 | 27 | 00100111 | ' |
40 | 28 | 00101000 | ( |
41 | 29 | 00101001 | ) |
42 | 2A | 00101010 | * |
43 | 2B | 00101011 | + |
44 | 2C | 00101100 | , |
45 | 2D | 00101101 | - |
46 | 2E | 00101110 | . |
47 | 2F | 00101111 | / |
48 | 30 | 00110000 | 0 |
49 | 31 | 00110001 | 1 |
50 | 32 | 00110010 | 2 |
51 | 33 | 00110011 | 3 |
52 | 34 | 00110100 | 4 |
53 | 35 | 00110101 | 5 |
54 | 36 | 00110110 | 6 |
55 | 37 | 00110111 | 7 |
56 | 38 | 00111000 | 8 |
57 | 39 | 00111001 | 9 |
58 | 3A | 00111010 | : |
59 | 3B | 00111011 | ; |
60 | 3C | 00111100 | < |
61 | 3D | 00111101 | = |
62 | 3E | 00111110 | > |
63 | 3F | 00111111 | ? |
64 | 40 | 01000000 | @ |
65 | 41 | 01000001 | A |
66 | 42 | 01000010 | B |
67 | 43 | 01000011 | C |
68 | 44 | 01000100 | D |
69 | 45 | 01000101 | E |
70 | 46 | 01000110 | F |
71 | 47 | 01000111 | G |
72 | 48 | 01001000 | H |
73 | 49 | 01001001 | I |
74 | 4A | 01001010 | J |
75 | 4B | 01001011 | K |
76 | 4C | 01001100 | L |
77 | 4D | 01001101 | M |
78 | 4E | 01001110 | N |
79 | 4F | 01001111 | O |
80 | 50 | 01010000 | P |
81 | 51 | 01010001 | Q |
82 | 52 | 01010010 | R |
83 | 53 | 01010011 | S |
84 | 54 | 01010100 | T |
85 | 55 | 01010101 | U |
86 | 56 | 01010110 | V |
87 | 57 | 01010111 | W |
88 | 58 | 01011000 | X |
89 | 59 | 01011001 | Y |
90 | 5A | 01011010 | Z |
91 | 5B | 01011011 | [ |
92 | 5C | 01011100 | \ |
93 | 5D | 01011101 | ] |
94 | 5E | 01011110 | ^ |
95 | 5F | 01011111 | _ |
96 | 60 | 01100000 | ` |
97 | 61 | 01100001 | a |
98 | 62 | 01100010 | b |
99 | 63 | 01100011 | c |
100 | 64 | 01100100 | d |
101 | 65 | 01100101 | e |
102 | 66 | 01100110 | f |
103 | 67 | 01100111 | g |
104 | 68 | 01101000 | h |
105 | 69 | 01101001 | i |
106 | 6A | 01101010 | j |
107 | 6B | 01101011 | k |
108 | 6C | 01101100 | l |
109 | 6D | 01101101 | m |
110 | 6E | 01101110 | n |
111 | 6F | 01101111 | o |
112 | 70 | 01110000 | p |
113 | 71 | 01110001 | q |
114 | 72 | 01110010 | r |
115 | 73 | 01110011 | s |
116 | 74 | 01110100 | t |
117 | 75 | 01110101 | u |
118 | 76 | 01110110 | v |
119 | 77 | 01110111 | w |
120 | 78 | 01111000 | x |
121 | 79 | 01111001 | y |
122 | 7A | 01111010 | z |
123 | 7B | 01111011 | { |
124 | 7C | 01111100 | | |
125 | 7D | 01111101 | } |
126 | 7E | 01111110 | ~ |
127 | 7F | 01111111 | DEL |