Asembler

Asembler 386 w Borlad C++

Andrzej Skoczylas 

Spor niedogodnoci jest fakt, e kompilator Borland C++ (v3.x), mimo opcji generowania kodu 80386, nie rozpoznaje waciwych dla tego procesora rozkazw asemblerowych wpisanych przy pomocy instrukcji "asm". Mona uywa w ten sposb tylko 16-bitowych rozkazw 286, co znacznie obnia przydatno wbudowanego asemblera.

Przykad:

asm add eax,edx // BD

386 rozpoznaje rozkazy rozpoczynajce si bajtem 66h jako rozszerzone, czyli odnoszce si do podwjnych sw (dword) i 32-bitowych rejestrw. Mona wic oszuka kompilator (niezalenie od opcji generowanego kodu). Wystarczy poprzedzi rozkaz 16-bitowy bajtem rozszerzenia:

asm db 0x66 // dla 286 jest to dana
asm add ax,dx // uzyskujemy add eax,edx

Dla wygody moemy utworzy makro, ktrego bdziemy uywa dla uzyskania rozkazw rozszerzonych:

#define xasm asm db 0x66; asm

Przykady:

xasm xor dx,dx // xor edx,edx
xasm shl ax,16 // shl eax,16
xasm mov dx,WORD PTR[xLong] // mov edx,DWORD PTR[xLong]

Sprawa troch si komplikuje, gdy operujemy wartociami natychmiastowymi. Aby np. wpisa liczb typu long do rejestru 32-bitowego naley uy dodatkowej danej 16-bitowej (dw) jako starszego sowa naszej wartoci natychmiastowej. 

Przykad:

xasm mov ax,0x1234 // mov eax,0x77881234h
asm dw 7788h

Jest to spowodowane tym, e w rozkazie 16-bitowym kompilator generuje dan natychmiastow 16-bitow. Procesor, odczytujc rozkaz jako 32-bitowy, pobiera dodatkowo dwa najstarsze bajty wartoci natychmiastowej.

Sposb ten moe by szczeglnie przydatny, gdy np. optymizujemy we wbudowanym asemblerze Borland C procedur operujc na zmiennych 32-bitowych (long). Moemy wykorzysta dokadne mnoenie i dzielenie, bardzo wygodne staje si przesuwanie bitowe.

Waciwie naleaoby jeszcze sprawdzi, czy procesor to przynajmniej 386... 
