Строки

Последнее обновление: 14.10.2023

В общем смысле слова строки представляют просто набор данныех, фактически массив чисел. В данном случае мы будем рассматривать строки как набор символов. Поскольку символы - это по сути числовые коды, то строку можно представить в виде набора числовых кодов символов:

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#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850