Попытка сделать 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
Что значит «символы над ним»? Кроме того, вы используете lea hello(%rip), %eax
по какой-то причине, связанной с хайном? вариативные функции принимают количество аргументов FP в AL, поэтому передавать указатель бесполезно. Кроме того, у вас нет указателя ни в одном аргументе, кроме RDI, но ваша строка формата содержит %4$s
, который ожидает строку arg. Вот откуда взялся (null)
: вместо segfaulting printf напечатал 0 в %r8
(я думаю) как (null)
. К счастью для вас, регистр, видимо, оказался не мусором, а нулем.
@Jester, я загружаю его с приветом, чтобы он мог распечатать себя. Quine - это функция, выводом которой является сам. Сейчас я добавляю ожидаемый результат.
Невозможно заставить printf
обрабатывать RAX как один из своих обычных аргументов. Каковы соглашения о вызовах для системных вызовов UNIX и Linux на i386 и x86-64
@PeterCordes символами над ним я имею в виду mov $ 10,% esi, mov $ 9,% edx и mov $ 34,% ecx.
поместите последний аргумент в r8
, а не в eax
. И не 32-битный r8d
, нужен полноценный 64-битный r8
; в OS X статические адреса не находятся в младших 64 битах адресного пространства. И перестанете ли вы использовать фрагменты Javascript? Желаемый результат - нет Javascript, поэтому просто используйте обычный блок форматирования кода (control-k).
@PeterCordes а, имеет смысл. Спасибо. Извините, я новичок в переполнении стека, я буду помнить об этом в следующий раз.
Каков ожидаемый результат? Также обратите внимание, что
al
должен быть загружен с количеством используемых векторных регистров (в данном случае ноль). Непонятно зачем загружать сhello
. Я тоже не вижу вашего 4-го аргумента.