Size: a a a

Ассемблер

2020 May 13

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
мож просто тупо для того чтоб стек очищать после отработки процедуры?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
я ж говорю напиши код и изучи дизассемблерный
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
а vararg@fastcall мож это простой флаг который говорит что "стек будем чистить потом, давай сначала посчитаем сколько там вообще аргументов"
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
перед вызовом fascall стваим флаг в 1, а в обработке самого fastcall проверяем этот флаг, если 1 то чистить будем потом
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
и по сути все сводится к к тому же fastcall но без очистки стека
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
но могу и ошибаться, никогда не заморачивался, а просто писал и исправлял ошибки
источник

RG

R G in Ассемблер
ладно спасибо буду разбираться...
источник

RG

R G in Ассемблер
хм он только в трех местах проверяется
if vararg@fastcall & ~ param eq rdx
   movq rdx,xmm1
 end if
....
if vararg@fastcall & ~ param eq r8
   movq r8,xmm2
 end if
....
if vararg@fastcall & ~ param eq r9
    movq r9,xmm3
  end if
источник

RG

R G in Ассемблер
и походу это не связано с очисткой стека
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
значит я ошибался
источник

RG

R G in Ассемблер
почитал макрос, функции с переменным числом параметров разруливает сам fastcall, считает число аргументов и тд
источник

RG

R G in Ассемблер
но в cinvoke почему то только вот это отличие с xmm'ами
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
вот видишь какое у тя поле для изучения асма, фасма, макросов, соглашений вызова появилось
источник

RG

R G in Ассемблер
вижу ))
источник

RG

R G in Ассемблер
ага, нашел на форуме вот такое:

msdn says that for varargs functions (and sprintf is one) floating point arguments must be duplicated in both integer and xmm registers.
источник

RG

R G in Ассемблер
http://msdn.microsoft.com/en-us/library/dd2wa36c.aspx wrote:

   If parameters are passed via varargs (for example, ellipsis arguments), then essentially the normal parameter passing applies including spilling the fifth and subsequent arguments. It is again the callee's responsibility to dump arguments that have their address taken. For floating-point values only, both the integer and the floating-point register will contain the float value in case the callee expects the value in the integer registers.

So actually the printf function is using the integer registers and ignores the xmm registers. So for the cinvoke fasm should be placing the data in both the xmm and integer registers.
источник

RG

R G in Ассемблер
похоже теперь понятно почему в макросе так сделано
источник

RG

R G in Ассемблер
источник

RG

R G in Ассемблер
источник

RM

Ricardo Milos in Ассемблер
Крч, я делаю сначала C код, а потом конвертирую в assembly через gcc -S
источник