Skocz do zawartości

MASM32 Błędy assemblacji


Sasza

Recommended Posts

Witam i proszę o pomoc!!

problem jest nastepujący:

piszę w Masm32v8 coś takiego:

movups xmm(1),xmm(2)

pcmpeqb xmm(1),[esi]

pmovmskb eax,xmm(1)

a otrzymuje taki kod:

0F ???
10 13 adc byte ptr [ebx],dl

0F ???
10 CA adc dl,cl

0F 74 0E pcmpeqb mm1,mmword ptr [esi]
0F ???
D7 xlat byte ptr [ebx]
C1 66 0F BA shl dword ptr [esi+0Fh],0BAh
E0 00 loopne Procedura+0CFh (00fc13b0)

według specyfikacji Intela powinno być inaczej

wygląda na to że masm32 żle koduje 128-bitowe instrukcje mmx

czy ktoś mi w tym pomoże ?? zaradzi ??

dziękuję
:D

Link do komentarza
Udostępnij na innych stronach

Witam!

Widzę że nie tylko ja z uczestników tego forum piszę w MASM :)

W jakim dissasemblerze to sprawdziłeś?
Bo to ważne ponieważ niektóre nie radzą sobie z instrukcjami pod nowe procesory np. ja mam coś takiego

W W32Dasm ver. 8.93:

0F        BYTE 0fh
10CA      adc dl, dl
0F740E    pcmpeqb mm1, dword ptr [esi] 
66        BYTE 066h
0F        BYTE 0fh
D7        xlat
C161EB33  shr ebx, 33 

Czyli poprostu totalne siano :(
Jak widać w ostatniej instrukcji W32Dasm próbuje C1 łaczyć z
następnymi i dlatego wychodzi mi cos takiego.

W OllyDbg ver. 1.04:

0F         DB 0F
10CA       ADC DL,CL
0F740E     PCMPEQB MM1,QWORD PTR DS:[ESI]
OFD7C1     PMOVMSKB EAX,MM1

Tu okazuje się że nie zna instrukcji MOVUPS więc czas na OllyDbg ver. 1.10:

0F10CA     MOVUPS XMM1, XMM2
0F740E     PCMPEQB MM1,QWORD PTR DS:[ESI]
OFD7C1     PMOVMSKB EAX,MM1

Więc sprawdziłem w IA-32 Opcode Map 1.5 i mam coś takiego:

PCMPEQB:

Opcode: 0F 74 /r
Memonics: PCMPEQB mm1,mm2/m64
Procesor: MMX
Destription: Compare packed bytes for equality

dalej patrząc mam coś takiego:

Opcode: 66 74 D7 /r
Memonics: PCMPEQB mm1,mm2/m128
Procesor: SSE2
Destription: Compare packed bytes for equality

PMOVMSKB:

Opcode: 0F D7 /r
Memonics: PMOVMSKB reg32,mm
Procesor: SSE
Destription: Move mask byte to register

niżej mam:

Opcode: 66 0F D7 /r
Memonics: PMOVMSKB reg32,xmm
Procesor: SSE2
Destription: Move mask byte to register

no to napisałem tak:

.686
.XMM
.model flat,stdcall
option casemap:none
.......
movups xmm(1),xmm(2) 
db 66h                ;Właśnie to ma znaczenie
pcmpeqb xmm(1),[esi]
db 66h                ;Właśnie to ma znaczenie
pmovmskb eax,xmm(1)
.......

I mam w OllyDbg ver. 1.10:

0F10CA    MOVUPS XMM1, XMM2
66:0F740E  PCMPEQB MM1,QWORD PTR DS:[ESI]
66:OFD7C1  PMOVMSKB EAX,MM1

Niby dalej twierdzi, że PCMPEQB MM1,QWORD PTR DS:[ESI] a nie PCMPEQB XMM1,QWORD PTR DS:[ESI] i PMOVMSKB EAX,MM1 a nie PMOVMSKB EAX,XMM1 widocznie on też nie obsługuje SSE2 :( No to pogrzebałem w internecie i znalazłem BDASM
https://www.bdasm.com/binaries/bdasmv1d_setup.exe
Uwaga: To jest wersja demo i obsługuje max 90000 linji kodu. Ale na potrzeby sprawdzenia wystarczyło. :)

0F10CA     movups  xmm1,xmm2
660F740E     pcmpeqb xmm1, qword ptr [esi]
660FD7C1   pmovmskb eax,xmm1

Więc chyba jest OK. :D

PS1: Sorry, że długo nie odpisywałem ale miałem problemy z wejściem na stronę mimo że ping wydawał sie niezły wiec nie wiem o co chodzi...
PS2: Sorry, że ten post jest taki długi ale ma on na celu wyjaśnienie jak pradzić sobie z takimi problemami a nie tylko suchą odpowiedź

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

Hej :)
Tym razem to ja przepraszam za zwłokę z mojej strony - różne rzeczy miały na nią wpływ :?
Powiem od razu:
Pomogłeś mi !!! i za to dziękuję - jestem wdzięczny :D
A teraz do rzeczy:
Mój debugger to VC++ 6.0 plus sp6 od wujka Billa :) 
Według mnie świetny debugger (w wersji z sp6)
Jak opisywałem mój problem to miałem bez tego sp6 i wychodziło siano tak jak u Ciebie. Korzystałem też z WinDbg ale było to samo.
Pokazałeś mi że w "naszym" masm32 trzeba "ręcznie" dopisac bajt 66h przed 128-bitowymi instrukcjami mmx :) i to jest rozwiązanie mojego problemu :) nie testowałem jeszcze SSE2 ani tym bardziej SSE3 bo narazie ich nie potrzebuję ale wiemy obaj że przynajmniej movups działa :)

Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Witam!

Tym razem nie pomogę :(
1. U mnie jest "normalnie" więc nie wiem dlaczego u Ciebie jest inaczej być może to wina wersji lub sposobu kompilacj.

Ja mam MASM v. 8.2 a kompilacja:
F:\MASM32\BIN\Ml.exe /c /coff test.asm
F:\MASM32\BIN\Link.exe /SUBSYSTEM:WINDOWS test.obj

2. Niestety nie wiem

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...