- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
[code]
// межстрочный асм в делфи
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
asm
jmp @code
@str: db 'Hello, world!', 0
@code:
xor ecx, ecx
xor ebx, ebx
mov ecx, 0
@start:
mov ebx, offset @str
push 0
push ebx
push ebx
push 0
call MessageBox
cmp ecx, 2
jne @start
end;
[/code]
Наверное MessageBox не возвращает 2 (я верно понимаю что это fastcall в WINAPI и там в ecx вертают значение?)
Блядь, двойка это Cancel.
А там нет Cancle. Ты же передаешь type 0, а 0 это только OK.
Единицу переджай туда и жми cance.
Учись MSDN читать
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
Что-то ты совсем не в тему написал.
MessageBox как и другие API возвращают результат в EAX. Не суть.
Я только хочу дважды показать, на результат не смотрю.
это stdcall а не fast.
Ну так тогда MessageBox тебе тупо твой ecx сбрасывает
Registers EAX, ECX, and EDX are designated for use within the function.
В общем, согласно stdcall, MessageBox не обязан сохранять значения регистров eax, ecx и edx. Если они для тебя важны - сохраняй их сам.
Там же еще важно кто стек чистит: колли или коллер. В каком-то асме (masm?) даже были макросы типа PROC где можно было указать конвенцию и не думать ни о чем.
Там были только C call и Pascal call.
Чуть не забыл: цимес в том, что в 64битном режиме там могут быть другие конвенции совсем)
Прямо в доке было сказано в какие регистры что пихать
Один был кол конвеншен: регисторы
А там соглашения вообще забавные... Наступить на грабли намного проще, чем в x86.
З.Ы. Напиши этот код на делфи, а потом почитай дизасм. Посмотришь, как компилятор эти проблемы решает.
В гостях себя так не ведут.
https://www.pochta.ru/tracking