Win32 fejlesztésre melyik assembler a jobb? A FASM vagy a MASM?
Igen NASM-ban is vannak makrók és definiálhatsz sajátokat is. If-re példa:
%if<condition>
; some code which only appears if <condition> is met
%elif<condition2>
; only appears if <condition> is not met but <condition2> is
%else
; this appears if neither <condition> nor <condition2> was met
%endif
De ajánlom hogy fogd a makrók használatát minimumra, az a tapasztalatom hogy ez elején segít, de a végén rengeteg fejfájás és bug forrása lehet és kevésbé lesz átláthatóbb egy jól megírt velük.
Nagyon megtetszett valamiért az assembly, úgy döntöttem, hogy nekikezdek, csak eleinte muszáj lesz használnom a macrokat mivel jobban átlátom mint a tiszta asm kódot. Mondjuk:
PUSH 0
call ExitProcess
Ez nekem jobban bejön:
invoke ExitProcess, 0
Azt nem mondom, hogy később nem változik a véleményem, de most még így könnyebb !
Köszönöm a válaszaid !
Ha jól tudom az INVOKE makrót alapból azért nem tartalmazza mert ez egy cross-platform assembler, és vannak olyan platformok ahol pl. a rendszerhívás paramétereit nem a stack-be kell tenni, hanem a register-ekbe.
Jó hír viszont hogy itt meg tudsz bármilyen makrót írni, és ami a még jobb benne, hogy már megírták helyetted:
NASMX egy makró csomag NASM-hoz, ami tartalmazza a ciklusokat, feltételes elágazásokat, függvény hívásokat, String kezelést, struktúrákat, típusokat, stb.
Itt egy példa program a dokumentációból amit kiszámolja kettőnek a valahányadik hatványát (de ez már annyira tele van pumpálva makrókkal hogy lassan nem is hasonlít az assembly-re amit meg akarsz tanulni):
%include 'nasmx.inc'
IMPORT cdecl,printf
PROTO my_pow2, uint32_t exp
ENTRY my_main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[section .text]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%define EXPONENT 8
PROC my_pow2, uint32_t exp
LOCALS NONE
mov eax, 1
mov ecx, uint32_t [argv(.exp)]
WHILE ecx,!=,0
IF ecx,>,31
xor eax,eax ; return 0 to indicate error
BREAK ; break out of while loop
ENDIF
shl eax, 1
dec ecx
ENDWHILE
ENDPROC
PROC my_main
LOCALS
LOCAL result, unint32_t, 1
ENDLOCALS
INVOKE my_pow2, EXPONENT
IF eax,!=,0
mov uint32_t [var(.result)], eax
INVOKE printf, message, EXPONENT, uint32_t [var(.result)]
ELSE
INVOKE printf, errmsg
ENDIF
ENDPROC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[section .data]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
message: declare(NASMX_TCHAR) NASMX_TEXT('The power of 2 to %u = %u'),13,10,0
errmsg: declare(NASMX_TCHAR) NASMX_TEXT('an error occurred!'),13,10,0
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!