Почему эта строка не печатается (сборка printf)?

Попытка сделать quine в сборке, однако, когда я пытаюсь распечатать строку, она не будет печататься, если я не удалю все символы над ней.

.data
hello: .string ".data%3$c%2$c%1$c hello: .string%4$s"

.text
.globl _main

_main:
    push %rbp
    mov %rsp, %rbp
    mov $10, %esi
    mov $9, %edx
    mov $34, %ecx
    lea hello(%rip), %eax
    lea hello(%rip), %rdi
    call _printf
    leave
    ret

Выход сейчас такой:

.data"  
 hello: .string(null)

Обновлено: ожидаемый результат

.data"  
 hello: .string.data%3$c%2$c%1$c hello: .string%4$s

Каков ожидаемый результат? Также обратите внимание, что al должен быть загружен с количеством используемых векторных регистров (в данном случае ноль). Непонятно зачем загружать с hello. Я тоже не вижу вашего 4-го аргумента.

Jester 13.09.2018 01:45

Что значит «символы над ним»? Кроме того, вы используете lea hello(%rip), %eax по какой-то причине, связанной с хайном? вариативные функции принимают количество аргументов FP в AL, поэтому передавать указатель бесполезно. Кроме того, у вас нет указателя ни в одном аргументе, кроме RDI, но ваша строка формата содержит %4$s, который ожидает строку arg. Вот откуда взялся (null): вместо segfaulting printf напечатал 0 в %r8 (я думаю) как (null). К счастью для вас, регистр, видимо, оказался не мусором, а нулем.

Peter Cordes 13.09.2018 01:49

@Jester, я загружаю его с приветом, чтобы он мог распечатать себя. Quine - это функция, выводом которой является сам. Сейчас я добавляю ожидаемый результат.

Stanislas Juery 13.09.2018 01:49

Невозможно заставить printf обрабатывать RAX как один из своих обычных аргументов. Каковы соглашения о вызовах для системных вызовов UNIX и Linux на i386 и x86-64

Peter Cordes 13.09.2018 01:50

@PeterCordes символами над ним я имею в виду mov $ 10,% esi, mov $ 9,% edx и mov $ 34,% ecx.

Stanislas Juery 13.09.2018 02:05

поместите последний аргумент в r8, а не в eax. И не 32-битный r8d, нужен полноценный 64-битный r8; в OS X статические адреса не находятся в младших 64 битах адресного пространства. И перестанете ли вы использовать фрагменты Javascript? Желаемый результат - нет Javascript, поэтому просто используйте обычный блок форматирования кода (control-k).

Peter Cordes 13.09.2018 02:09

@PeterCordes а, имеет смысл. Спасибо. Извините, я новичок в переполнении стека, я буду помнить об этом в следующий раз.

Stanislas Juery 13.09.2018 02:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
37
0

Другие вопросы по теме