Вызовите сохранение MASM автоматически? - PullRequest
1 голос
/ 16 ноября 2010

Можно ли автоматически сохранять регистры процессора, когда я использую директиву Invoke в masm?

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Посмотрите на пример, который я разместил там: сортировка выбора на языке ассемблера

Директива USES в целевом PROC - это то, что вы ищете.автоматически сохранять эти регистры при входе в PROC и восстанавливать их при выходе (даже если у вас есть несколько точек RET, и даже если не рекомендуется иметь несколько точек возврата).IOW, он будет генерировать PUSHes при входе в PROC и POP с последовательным соответствием (в обратном порядке) перед каждым RET.Идея состоит в том, что, поскольку это сборка, у вас есть полный контроль и ответственность за те регистры, которые вы изменяете и хотите сохранить.
И вопреки тому, что было предложено где-то еще, объявление stdcall ничего не сохраняетавтоматически для вас в MASM.Он просто определяет, POP вызывающего абонента (код, сгенерированный для INVOKE) или вызываемого абонента (код, сгенерированный в PROC).

1 голос
/ 16 ноября 2010

Соглашение о вызове "stdcall" гарантирует, что функция не испортит никаких регистров, кроме eax, edx, ecx.Если вы хотите сохранить edx и ecx - напишите макрос.

0 голосов
/ 16 ноября 2010

Не уверен, что именно вы имели в виду, и, поскольку ваш тег - это masm32, я предполагаю, что Windows x86.

Что вполне возможно, это выдвинуть все аргументы, которые требует вызов API, и затем вы просто вызываетежелаемая функция.Я имею в виду, что когда вы указываете сборку для Windows, вам не нужно использовать регистры для «вызова» API, вы должны выдвинуть аргументы и затем вызвать (или вызвать) API.

Например, это:

push 0
push DWORD PTR SS:[EBP+8]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset AppName
push offset ClassName
push 0h
call CreateWindowExA

точно равно этому (на самом деле только значения параметров различаются):

invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
       WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
       hInst,NULL

Это то, что вы имели в виду в своем вопросе

...