MinGW (Minimalistic GNU for Windows) to zestaw kompilatorów języka C, C++, FORTRAN, Asemblera.

Zawierający kultowy kompilator GCC, znany użytkownikom linuxa. GCC umożliwia tworzenie aplikacji działających w konsoli i okienkowych (w32api). Istotna jest także możliwość dołączania kodu asemblera. Należy jednak przy tym zaznaczyć, że wstawki asemblerowe muszą być napisane w GNU Asemblerze. Dołączony kompilator asemblera AS także obsługuje składnię GNU Asemblera. Składnia GNU Asemblera dla użytkowników programujących w asemblerze x86 może na początku stanowić pewną niedogodność, ale szybko można pokonać początkowe trudności.

Pakiet zawiera także GNU debugger potężne narzędzie pozwalające na debugowanie kodu.

Poniżej przedstawiono przykład pracy w MinGW.

Po instalacji należy dodać katalog w którym znajdują się kompilatory do zmiennych środowiska (katalog BIN).

C:>path c:mingwbin

Następnie za pomocą dowolnego edytora piszemy program. Poniżej program napisany w asemblerze umieszczający w rejestrze eax liczbę 65535 oraz obliczający wartość wyrażenia 0.(3)/0.(6).

SYSEXIT =1
EXIT_SUCCESS =0
.align 32
.data
arg1:    .float    0f+0.33333333E-0
arg2:    .float    0f+0.66666666E-0
liczba:    .long    65535
.text
.global _start
_start:
finit
movl    liczba(,1),%EAX
flds    arg1(,1)
fdivs    arg2(,1)

movl    $SYSEXIT, %eax
int    $0x80

Program w GNU Asemblerze kompilujemy za pomocą dołączonego kompilatora AS opcja –gstabs umożliwia zapamiętanie nazw symbolicznych zmiennych

C:>as –gstabs num.s -o num.o

linkujemy program

C:>mingwbinld num.o -o num

uruchamiamy GDB jako parametr podając nazwę programu

C:>gdb num

ustawiamy break na 16 linijce wpisując break 16

(gdb) break 16

komendą run uruchamiamy program

(gdb) run
Starting program: C:num
Breakpoint 1, start () at num.s:16
16    movl    $SYSEXIT, %eax
sprawdzamy zawartość rejestrów procesora eax powinien zawierać liczbę 65535
czyli FFFF w kodzie heksadecymalnym

(gdb) info register
eax    0xffff    65535
ecx    0x22ffb0    2293680
edx    0x7ffe0304    2147353348
ebx    0x7ffdf000    2147348480
…..    ……………..    ………………

Obliczony iloraz 0,(3)/0,(6) zdajduje się na stosie koprocesora w rejestrze st(0) (R7). Stan koprocesora sprawdzamy komendą info float

(gdb) info float =>R7: Valid    0x3ffe8000000000000000 +0.5
R6: Empty    0x00000000000000000000
R5: Empty    0x00000000000000000000
R4: Empty    0x00000000000000000000
R3: Empty    0x00000000000000000000
R2: Empty    0x00000000000000000000
R1: Empty    0x00000000000000000000
R0: Empty    0x00000000000000000000

Status Word:    0xffff3800
TOP: 7
Control Word:    0xffff037f    IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest

+0.5 to prawidłowy wynik z opuszczamy debugger wpisując q

(gdb) q

Uwaga!
W gdb możliwe jest stosowanie skrótów np. zamiast info registers = i r, info float = i fl, break = b