ono možná nejde ani tak o to, že by byl FASM tak dobrý, jako že GAS je špatný. Špatný v porovnání třeba s assemblery, které se skutečně používaly pro i velké aplikace. TASM a MASM, v nich vznikaly i větší projekty. FASM taky není žádný král v oznamování chyb; prostě skončí na řádku XY a to je tak vše. V tomto ohledu zlaté TASM a MASM, ale chápu, že dneska to už asi málokoho trápí.
on GNU Assembler asi nikdy nebyl myšlen na skutečné programování něčeho většího, na to mu tam chybí lepší chybová hlášení (třeba u maker) a příliš nízkoúrovňový přístup. Taky ještě relativně nedávno měl jen AT&T syntaxi a i přes některé její výhody jsem se toho nechtěl dotýkat ani dlouhým klackem :-) S Intelí syntaxí je to už lepší, ale IDEAL režim starého dobrého TASMu mi stále chybí. A ani FASM ani NASM tohoto stavu stále nedosahují.
Svého času jsem k překladům používal JWASM, což byl v podstatě s MASM kompatibilní překladač, ale na rozdíl od MASM byl open source a pod licencí, která umožňovala i komerční použití bez omezení. Co si pamatuji, tak to skutečně kompatibilní bylo s MASM 6.x, a nebyl problém svižně přeložit poměrně rozsáhlé projekty i pro win 32, protože zde byly přiloženy windowsí hlavičkové soubory konvertované do asm. Teď ale koukám, že "svého času" už je fakt dávno, neboť se JWASM už nějakých 10 let nevyvíjí.
Cau Pavle, ja jsem dlouho pouzival assembler WASM od Watcomu, nyni OpenWatcom.
Za mne syntaxe skoro ala turbo assembler a taky umi kompilovat pro DOS16, DOS32, Win16, Win32, a nakonec i linux!
A navic zvlada i specifikaci predavani argumentu pres vyjmenovane registry pro C-ckovy kod :-)
Treba toto, tri ruzne kusy kodu z jednoho meho projektu (rezidentni SLIP/ETH IP protokol 'prevodnik'):
`prolog.inc`:
.model tiny,SYSCALL
.286
_TEXT segment public 'BRIDGECODE'
ifndef VERSION
VERSION equ 011ACh
endif
;This forces everything into the same segment :-)
ASSUME CS:_TEXT, DS:_TEXT, SS:_TEXT
`COM_ASM.ASM`:
include 'prolog.inc'
include 'uart.inc'
public _ComSetChainISR
public _ComISR
extrn _ComRecvChar:near
extrn _ComSendChar:near
extrn _BridgeFIFOLen:byte
; ISR chaining ....
CHAIN_ISR dd ? ; SEG ^ OFS
HAVE_ISR_CHAIN dw 0
HAVE_SMART_CHAIN dw 0
_ComSetChainISR:
mov CS:HAVE_SMART_CHAIN,BX
mov word ptr CS:CHAIN_ISR,AX
mov word ptr CS:CHAIN_ISR+2,DX
or AX,DX
mov CS:HAVE_ISR_CHAIN,AX
ret
'COM.H':
// for IRQ chaining
WORD ComSetChainISR(void far *ISR,WORD Smart);
#pragma AUX ComSetChainISR parm [ DX AX ] [ BX ] value [ AX ] modify [ DX ];