Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.6.75] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток!
Подскажите как корректно перевести такой простенький 32-разрядный код, под 64-разряда: ... _Format BYTE "Test %s!", 10, 13, 0 ... call readName ;здесь я читаю строку с консоли lea ebx, _Format push eax push ebx call printf ;а здесь, вывожу ее на экран add esp, 8 ... делаю так: ... _Format BYTE "Test %s!", 10, 13, 0 ... lea rbx, _Format push rax push rbx call printf add rsp, 8 ... но вылетает на: call printf Заранее спасибо! |
Сообщ.
#2
,
|
|
|
OS2_, слишком мало данных. Нужно знать каким образом printf осуществляет передачу параметров.
|
Сообщ.
#3
,
|
|
|
Это всего-навсего тестовый пример, который я пытался перевести на 64-бита. Вот полный листинг asm файла:
%if ASM_WIN64 %else .686 .MODEL FLAT, C .STACK %endif .DATA .CODE _Format BYTE "Test %s!", 10, 13, 0 .CODE EXTRN printf : proc EXTRN readName : proc sayHello PROC call readName; eax = readName() %if ASM_WIN64 ;printf(rbx,rax) lea rbx, _Format push rax push rbx call printf add rsp, 8 %else ;printf(ebx,eax) lea ebx, _Format push eax push ebx call printf add esp, 8 %endif ;retn sayHello ENDP asm_finit PROC finit ret asm_finit ENDP END |
Сообщ.
#4
,
|
|
|
Т.к. 64-битные регистры длиной в 8 байт, то (по аналогии) надо ж наверное к RSP добавлять 2*8 = 16 байт, а не 8.
|
Сообщ.
#5
,
|
|
|
Славян
Пробовал и так делать. Но вылетает именно при вызове printf... |
Сообщ.
#6
,
|
|
|
OS2_, так printf-то откуда???? Я все ответа на мой вопрос не вижу. Ты сишную printf пытаешься вызвать?
Добавлено Вообще, если речь о вызове функции для яву, то в x86-64 обычно параметры передаются через регистры, а не стек. |
Сообщ.
#7
,
|
|
|
Пытаюсь вызвать сишную printf, в 32 битной версии она отлично вызывается и ей передаются все аргументы.
|
Сообщ.
#8
,
|
|
|
Для тех, кто в танке, сишные функции в x86-64 передают параметры через регистры, а не через стек как у тебя.
План действий: 1 Скомпилируй обычную сишную программу с printf. 2. Открой в дизассемблере, найти вызов printf (для mingw элементарно с gbd). 3. Из ассемблерного листинга запомни через какие регистры передаются параметры. 4. Повтори тоже самое в своей asm-программе. 5. PROFIT Добавлено Как-то так (не проверял): ... push rbp lea rdi, format; формат строки mov rsi, rax; 1 параметр mov rax, 0 call printf pop rbp ... |
Сообщ.
#9
,
|
|
|
Цитата а проверить стоит! для целочисленных параметров должно быть так Как-то так (не проверял): CollapsedWrap disabledLine numbers off ... push rbp lea rdi, format; формат строки mov rsi, rax; 1 параметр mov rax, 0 call printf pop rbp sub rsp,20h <--для 4-х и менее параметров mov r9,3-й_параметр mov r8,2-й_параметр mov rdx,1-й_параметр lea rcx,строка_содержащая_формат call printf add rsp,20h |
Сообщ.
#10
,
|
|
|
Цитата Mikl___ @ Может, 28h всё-таки? sub rsp,20h <--для 4-х и менее параметров С учётом call'а. p.s. Welcome на Исходники, дружище! Только зачем реанимировать тему годичной давности? |
Сообщ.
#11
,
|
|
|
Jin X,
"учет калла" происходит при входе в программу (push reg/enter 0,0/sub rsp,8), а далее каждая функция обрамляется sub rsp,X*10h/add rsp,X*10h для 4 и менее параметров X=2; для 5/6 Х=3; для 7/8 Х=4 и т.д. А тему поднял потому как отвечать пока некому а некрофилов я и сам не люблю |
Сообщ.
#12
,
|
|
|
Тогда сделаем пометку, что "20h – с учётом того, что push rbp/enter 0,0/sub rsp,8 (нужно подчеркнуть) уже сделан"
p.s. Да, тут у нас в разделе тишь да гладь... |