Różnice składniowe inline Asemblera

skylark

Użytkownik
Dołączył
Luty 8, 2012
Posty
2
Czy istnieje coś takiego jak standard asemblera?

Pisząc wstawki asemblerowe pod Borlandem, mogłem użyć następującej instrukcji np.:

Kod:
     lea esi, esi+ecx*4

    //zamiast
    shl ecx, 2  
    add esi, ecx

jednak Visual Studio zgłasza błąd.

Inne różnice to np.:
mov [esi], xmm0

Visual tu nie wykrywa błędu.

Pod Visualem mogę pisać:

int x[4];
...
movdqu xmm0, x


gdy Borland zgłasza błąd.
 

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Te błędy są powodowane przez różnice składniowe różnych asemblerów.
 

skylark

Użytkownik
Dołączył
Luty 8, 2012
Posty
2
Nawet niektóre kody języków wysokiego poziomu nie kompilują się bezbłędnie i wymagają poprawek, a co dopiero
asembler.

Jeżeli chodzi o instrukcję lea i obliczanie adresu to powinno się zapisać:

lea esi, [esi+ecx*4]

Natomiast, gdy zapiszemy:

mov [esi], xmm0

to kompilator wyświetli ostrzeżenie.

movdqu xmm0, x

jeżeli x jest zmienną na stosie (ang. stack), to kompiluje się i działa prawidłowo.
Adres takiej zmiennej to [ebp-imm32].

Podam jeszcze jeden przykład niekompatybilności:

cmp [edi+ecx*4], 3

Jaki jest rozmiar wartości natychmiastowej 3, byte, word, dword, qword?

Kompilator użył rozmiaru byte.
 
Do góry Bottom