Строки

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

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

.data 
    chars: .byte 72, 101, 108, 108, 111     # строка "Hello"

Можно использовать символы:

.data 
chars: .byte 'H', 'e', 'l', 'l', 'o'

Однако в реальности проще работать с набором чисел как с одним целым. Поэтому для определения строк в ассемблере GAS предназначены специальные директивы .ascii и .asciz, а сама строка определяется в двойных кавычках:

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