169 похожих чатов

Fasm портит подобные конструкции: lea rdx,[metka] invoke MessageBoxA,0,0,rdx,0 Генерирует он тут следующее: mov rcx,0

; 1 аргумент
mov rdx,0 ; 2 аргумент - загружен в rdx
mov r8,rdx ; 3 аргумент - но к этому моменту он уничтожен
mov r9,0 ; 4 аргумент
call qword ptr ds:[<&MessageBoxA>]
Как решать это проблему автоматически?
Или хотя бы чтобы он выдавал сообщение об ошибке, а не по тихому портил бы код.

11 ответов

25 просмотров

Никак, только ручками. Или не использовать invoke, а самому контролировать передаваемые параметры

lea rdx,[metka] mov r8, rdx invoke MessageBoxA,0,0,r8,0 код mov r8, r8 не генерируется инвоуком

Что то такое припоминаю, что по какому то там стандарту типа fastcall регистры выше r7 активно юзаются ОС поэтому там может быть что угодно в любой момент времени! Еще от ос зависит вроде. Хотя это не точно!

попробуй invoke MB,0,0, addr metka,0 хотя эт больше для лок. данных на стеке хотя все равно надо учитывать используемые регистры

ошибка не у него, ошибка у тебя. асм сделал ровно то что ьы ему сказал, синтаксических ошибок нет

Евгений- Автор вопроса
Aiwan \ (•◡•) / _bot
ошибка не у него, ошибка у тебя. асм сделал ровно ...

Асм мог бы учесть занятые регистры и заполнять регистры fastcall в другой последовательности либо хотя бы уведомлять об этом. Вместо mov rcx,0 ; 1 аргумент mov rdx,0 ; 2 аргумент - загружен в rdx mov r8,rdx ; 3 аргумент - но к этому моменту он уничтожен mov r9,0 ; 4 аргумент мог бы делать mov rcx,0 ; 1 аргумент mov r8,rdx ; 3 аргумент mov rdx,0 ; 2 аргумент mov r9,0 ; 4 аргумент

Евгений- Автор вопроса
Денис Фомин Fomin
Что то такое припоминаю, что по какому то там стан...

Это не так, там тоже есть соглашение по регистрам как и в 32бит. rax, rcx, rdx, r8, r9, r10, r11 - можно портить rbp, rsi, rdi, rbx, r12, r13, r14, r15 - не портятся при вызовах API, и при использовании надо сохранять в процедурах

Евгений
Асм мог бы учесть занятые регистры и заполнять рег...

ты всегда можешь это (проверки, контроль) сделать сам, дополнив макросы. то о чем ты говоришь занимаюися компили ЯВУ

Евгений
Асм мог бы учесть занятые регистры и заполнять рег...

Асм мог бы учесть занятые регистры регистры всегда чем то заняты. даже в "пустом" регистре содержится ноль либо мусор. а что именно содержится в регистре (нужное или нет) определяет программист. и раз ты портишь rdx значит ты знаешь что делаешь

Денис Фомин Fomin
Что то такое припоминаю, что по какому то там стан...

скорее всего ось их не будет трогать, либо обнулит, это же потенциальная дыра в безопасности

disba1ancer
скорее всего ось их не будет трогать, либо обнулит...

Да вот где то что то такое читал, не могу теперь вспомнить где :)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта