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