Для получения текущего адреса в ассемблере 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