В общем смысле слова строки представляют просто набор данныех, фактически массив чисел. В данном случае мы будем рассматривать строки как набор символов. Поскольку символы - это по сути числовые коды, то строку можно представить в виде набора числовых кодов символов:
section .data chars db 72, 101, 108, 108, 111 ; строка "Hello"
То есть фактически строка представляет набор числовых символов из таблицы ASCII. Можно использовать символы:
section .data chars db "H", "e", "l", "l", "o"
Однако для упрощения определения строк NASM позволяет определить всю строку в двойных кавычках:
section .data chars db "Hello"
Если надо добавить в строку какие-то непечатные символы, например, перевод на новую строку (числовой код - 10), то их можно добавить к строке через запятую:
section .data chars db "Hello", 10
Если в строке сочетаются печатные и непечатные символы, то их можно перечислять через запятую:
section .data chars db "Hello", 10, "Hello Word"
При получении строки через имя переменной в регистр помещается первый символ строки
global _start section .data message db "Hello METANIT.COM" section .text _start: movzx rdi, byte [message] ; в RDI = 72 - код символа "H" mov rax, 60 syscall
Многие распространенные операционные системы имеют специальные системные вызовы для вывода строки. В зависимости от конкретной системы детали этих вызовов - их номер и параметры будут отличаться. Например, на Linux это системная функция write, которая имеет номер 1 и которая принимает 3 параметра:
В регистр RDI помещается дескриптор вывода - то есть куда выводить строку. К примеру, это может быть файл на диске, консоль и т.д.
В регистр RSI помещается адрес строки
В регистр RDX помещается количество символов строки
Например, выведем строку на консоль в Linux:
global _start section .data message db "Hello METANIT.COM" count equ $-message ; длина строки в байтах section .text _start: mov rdi, 1 ; в RDI - дексриптор вывода в стандартный поток (консоль) mov rsi, message ; в RSI - адрес строки mov rdx, count ; в RDX - длина строки mov rax, 1 ; в RAX - номер функции для вывода в поток syscall ; вызываем функцию write mov rax, 60 syscall
Пример компиляции и выполнения программы:
eugene@Eugene:~/asm# nasm -f elf64 hello.asm -o hello.o eugene@Eugene:~/asm# ld hello.o -o hello eugene@Eugene:~/asm# ./hello Hello METANIT.COM eugene@Eugene:~/asm#