Строки представляют набор символов. Поскольку символы - это по сути числовые коды, то строку можно представить в виде набора числовых кодов символов:
.data chars: .byte 72, 101, 108, 108, 111 # строка "Hello"
Можно использовать символы:
.data chars: .byte 'H', 'e', 'l', 'l', 'o'
Однако в реальности проще работать с набором чисел как с одним целым. Поэтому для определения строк в ассемблере GAS предназначены специальные директивы
.data message1: .ascii "Hello METANIT.COM\n" message2: .asciz "Hello World\n"
То есть фактически строка представляет набор числовых символов из таблицы ASCII. Директива .asciz кроме того добавляет к строке нулевой байт, который служит признаком окончания строки.
При получении строки через имя переменной в регистр помещается первый символ строки
.globl _start .data message: .asciz "Hello METANIT.COM" .text _start: movq message, %rdi # в RDI числовой код символа H - 72 movq $60, %rax syscall
Многие распространенные операционные системы имеют специальные системные вызовы для вывода строки. В зависимости от конкретной системы детали этих вызовов - их номер и параметры будут отличаться. Например, на Linux это системная функция write, которая имеет номер 1 и которая принимает 3 параметра:
В регистр RSI помещается адрес строки
В регистр RDI помещается дескриптор вывода - то есть куда выводить строку. К примеру, это может быть файл на диске, консоль и т.д.
В регистр RDX помещается количество символов строки
Например, выведем строку на консоль в Linux:
.globl _start .data message: .asciz "Hello METANIT.COM\n" # текст выводимого сообщения count = . - message # длина сообщения .text _start: movq $message, %rsi # в RSI - адрес строки movq $1, %rdi # в RDI - дексриптор вывода в стандартный поток (консоль) movq $count, %rdx # в RDX - длина строки movq $1, %rax # в RAX - номер функции для вывода в поток syscall # вызываем функцию Linux movq $60, %rax syscall
Пример компиляции и выполнения программы:
eugene@Eugene:~/asm# as hello.s -o hello.o eugene@Eugene:~/asm# ld hello.o -o hello eugene@Eugene:~/asm# ./hello Hello METANIT.COM eugene@Eugene:~/asm#