Получение текущего адреса

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

Для получения текущего адреса в ассемблере GAS применяется оператор точка .. Например:

currentAddr: .quad .

Здесь переменная currentAddr хранит свой собственный адрес.

Получение текущего адреса может помочь в ряде задач. Распространенная задача - получение длины строки или массива чисел. В общем случае мы можем определить переменную и непосредственно присвоить ей размер. Однако при этом можно ошибиться, неправильно подсчитать. Использование текущего адреса позволяет решить эту задачу:

.globl _start

.data
nums: .quad 1, 2, 3, 4, 5, 6
count: .quad .- nums

.text
_start:
    movq count, %rdi    # помещаем в RDI размер массива nums
    
    movq $60, %rax
    syscall

Здесь выражение .- nums отнимает от текущего адреса адрес переменной nums, и таким образом переменная count фактически представляет размер массива nums. То есть в регистрре RDI будет помещаться число 48 (6 чисел по 8 байт).

Однако нам бы хотелось найти количество элементов в массиве, а не просто его длину. В этом случае можно разделить полученное значение на размер элемента:

.globl _start

.data
nums: .quad 1, 2, 3, 4, 5, 6
count: .quad (.-nums)/8

.text
_start:
    movq count, %rdi    # помещаем в RDI количество элементов в массиве nums
    
    movq $60, %rax
    syscall

Поскольку мы имеет дело с 8-байтными числами, то размер массива делим на 8 и таким образом получаем количество элементов.

count: .quad (.-nums)/8
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850