Thread View: pl.comp.lang.asm
11 messages
11 total messages
Started by Lopez
Sun, 05 Feb 2006 17:33
AT&T i call
Author: Lopez
Date: Sun, 05 Feb 2006 17:33
Date: Sun, 05 Feb 2006 17:33
17 lines
964 bytes
964 bytes
Witam Mam instrukcje w skladni intela call dword [table+eax*4] to w at&t to bedzie call *table(,%eax,4) czy call table(,%eax,4) bo nie mam pewnosci. -- Pozdrawiam Lopez
Re: AT&T i call
Author: Bogdan (bogdro)
Date: Sun, 05 Feb 2006 19:19
Date: Sun, 05 Feb 2006 19:19
31 lines
1901 bytes
1901 bytes
Lopez napisał(a): > Witam > > Mam instrukcje w skladni intela > > call dword [table+eax*4] > > to w at&t to bedzie > > call *table(,%eax,4) > czy > call table(,%eax,4) > > bo nie mam pewnosci. Z tego, co kiedyś wyczytałem: http://rudy.mif.pg.gda.pl/~bogdro/linux/attintel.html Jeśli dobrze to zrozumiałem, stawiałbym na gwiazdkę. Jeśli w zamian dostaniesz SIGSEGV, to pewnie chodziło o to drugie rozwiązanie. :) Najszybciej byłoby, gdybyś przetestował (najpierw sprawdzając, czy oba warianty się kompilują). Koniecznie podziel się wynikami, zostanie dla potomności. Wkrótce będę miał więcej czasu, więc może zabiorę się w końcu za dokończenie tego mojego porównania (jeśli znajdę jakieś dobre źródło). -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Forum o programowaniu: http://programista.xorg.pl
Re: AT&T i call
Author: Bogdan (bogdro)
Date: Sun, 05 Feb 2006 20:10
Date: Sun, 05 Feb 2006 20:10
43 lines
1993 bytes
1993 bytes
Bogdan (bogdro) napisał(a):
> Lopez napisał(a):
>> Witam
>>
>> Mam instrukcje w skladni intela
>>
>> call dword [table+eax*4]
>>
>> to w at&t to bedzie
>>
>> call *table(,%eax,4)
>> czy
>> call table(,%eax,4)
>>
>> bo nie mam pewnosci.
[...]
Dobra, potestowałem trochę. Oto wyniki:
call *table(,%eax,4)
daje (ndisasm -u -e 0x34):
FF148500000000 call near [eax*4+0x0]
Rzecz jasna, zera zostałyby zastąpione prawidłowym adresem na etapie
linkowania.
Tymczasem:
call table(,%eax,4)
daje:
Warning: indirect call without `*'
Niemniej, kod się kompiluje, a skompilowane bajty ... wychodzą takie
same, jak poprzednio. Ale najwyraźniej bardziej zgodna ze składnią
AT&T jest ta pierwsza wersja.
Najlepiej to by było sprawdzić po linkowaniu.
Dorzucę te wyniki do mojej stronki o porównaniu AT&T-Intel, nad którą
już pracuję.
--
Pozdrawiam, Bogdan (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Forum o programowaniu: http://programista.xorg.pl
Re: AT&T i call
Author: Lopez
Date: Sun, 05 Feb 2006 21:49
Date: Sun, 05 Feb 2006 21:49
84 lines
2663 bytes
2663 bytes
Bogdan (bogdro) napisał(a):
> Lopez napisał(a):
>
>>Witam
>>
>>Mam instrukcje w skladni intela
>>
>>call dword [table+eax*4]
>>
>>to w at&t to bedzie
>>
>>call *table(,%eax,4)
>>czy
>>call table(,%eax,4)
>>
>>bo nie mam pewnosci.
>
> Z tego, co kiedyś wyczytałem:
> http://rudy.mif.pg.gda.pl/~bogdro/linux/attintel.html
> Jeśli dobrze to zrozumiałem, stawiałbym na gwiazdkę. Jeśli w zamian
> dostaniesz SIGSEGV, to pewnie chodziło o to drugie rozwiązanie. :)
> Najszybciej byłoby, gdybyś przetestował (najpierw sprawdzając, czy oba
> warianty się kompilują).
Bez gwiazdki tez sie kompiluje, i wypluwa identyczny kod,
aczkolwiek daje komunikat
call.S:14: Warning: indirect call without `*'
Co najlepsze intel2gas tlumaczy mi to na call table(%eax,4),
co daje komunikat
call.S:14: Warning: scale factor of 4 without an index register
a uruchomienie programu konczy sie segfaultem.
Ponizej przyklad potwierdzajacy wariant z gwiadka, tak dla
potomnosci. Jakby komus nie dzialalo, dajcie znac.
plik call.S:
.code32
.text
.extern f1
.extern f2
.globl functable
functable: .long f1, f2
.globl asmfunc
asmfunc:
pushl %eax
xorl %eax, %eax
call *functable(%eax,4)
movl $1, %eax
call *functable(%eax,4)
popl %eax
ret
plik main.c:
#include <stdio.h>
extern void asmfunc(void);
int main()
{
asmfunc();
return 0;
}
void f1(void) { printf("f1\n"); }
void f2(void) { printf("f2\n"); }
i wreszcie Makefile:
.SUFFIXES: .c .S
CC = gcc
OBJS = main.o call.o
TARGET = call
all: $(OBJS)
$(CC) -o $(TARGET) $(OBJS)
.c.o:
$(CC) -c -o $(@) $(<)
.S.o:
$(CC) -c -o $(@) $(<)
clean:
rm -f $(OBJS) $(TARGET)
--
Pozdrawiam
Lopez
Re: AT&T i call
Author: Lopez
Date: Sun, 05 Feb 2006 21:59
Date: Sun, 05 Feb 2006 21:59
48 lines
1965 bytes
1965 bytes
Bogdan (bogdro) napisał(a): > Bogdan (bogdro) napisał(a): > >>Lopez napisał(a): >> >>>Witam >>> >>>Mam instrukcje w skladni intela >>> >>>call dword [table+eax*4] >>> >>>to w at&t to bedzie >>> >>>call *table(,%eax,4) >>>czy >>>call table(,%eax,4) >>> >>>bo nie mam pewnosci. > > [...] > Dobra, potestowałem trochę. Oto wyniki: > > call *table(,%eax,4) > daje (ndisasm -u -e 0x34): > FF148500000000 call near [eax*4+0x0] > > Rzecz jasna, zera zostałyby zastąpione prawidłowym adresem na etapie > linkowania. > > Tymczasem: > call table(,%eax,4) > daje: > Warning: indirect call without `*' > > Niemniej, kod się kompiluje, a skompilowane bajty ... wychodzą takie > same, jak poprzednio. Ale najwyraźniej bardziej zgodna ze składnią > AT&T jest ta pierwsza wersja. > Najlepiej to by było sprawdzić po linkowaniu. Rownolegle przeprowadzilem te same testy i wrzucilem dzialajacy przyklad. Niemniej jednak mam kod, w ktorym mi cos nie gra i musialem sie upewnic, ze akurat tu jest ok. Dzieki. -- Pozdrawiam Lopez
Re: AT&T i call
Author: Wiktor S.
Date: Sun, 05 Feb 2006 22:00
Date: Sun, 05 Feb 2006 22:00
10 lines
1460 bytes
1460 bytes
> Z tego, co kiedyś wyczytałem: > http://rudy.mif.pg.gda.pl/~bogdro/linux/attintel.html > Jeśli dobrze to zrozumiałem, stawiałbym na gwiazdkę. Jeśli w zamian > dostaniesz SIGSEGV, to pewnie chodziło o to drugie rozwiązanie. :) > Najszybciej byłoby, gdybyś przetestował (najpierw sprawdzając, czy oba > warianty się kompilują). > Koniecznie podziel się wynikami, zostanie dla potomności. > > Wkrótce będę miał więcej czasu, więc może zabiorę się w końcu za > dokończenie tego mojego porównania (jeśli znajdę jakieś dobre źródło).
Re: AT&T i call
Author: Wiktor S.
Date: Sun, 05 Feb 2006 22:03
Date: Sun, 05 Feb 2006 22:03
26 lines
1630 bytes
1630 bytes
>> Niemniej, kod się kompiluje, a skompilowane bajty ... wychodzą takie >> same, jak poprzednio. Ale najwyraźniej bardziej zgodna ze składnią >> AT&T jest ta pierwsza wersja. >> Najlepiej to by było sprawdzić po linkowaniu. > > Rownolegle przeprowadzilem te same testy i wrzucilem > dzialajacy przyklad. Niemniej jednak mam kod, w ktorym > mi cos nie gra i musialem sie upewnic, ze akurat tu jest ok. Inna interpretacja instrukcji jest chyba niemożliwa, bo pod nasmem kompiluje się tylko table: call dword [table+eax*4] i daje (66 67) FF 14 85 00 00 00 00 natomiast call dword table+eax*4 zwraca "error: invalid operand type" -- Azarien
Re: AT&T i call
Author: Lopez
Date: Sun, 05 Feb 2006 22:34
Date: Sun, 05 Feb 2006 22:34
23 lines
1392 bytes
1392 bytes
Wiktor S. napisał(a): > Inna interpretacja instrukcji jest chyba niemożliwa, bo pod nasmem > kompiluje się tylko > > table: > call dword [table+eax*4] > > i daje (66 67) FF 14 85 00 00 00 00 > > natomiast > > call dword table+eax*4 > > zwraca "error: invalid operand type" Ciekawe co by na to TASM powiedzial. Tam zdaje sie zapis [table] i table znaczyl to samo. -- Pozdrawiam Lopez
Re: AT&T i call
Author: Bogdan (bogdro)
Date: Mon, 06 Feb 2006 12:00
Date: Mon, 06 Feb 2006 12:00
29 lines
2127 bytes
2127 bytes
Lopez napisał(a): > Bez gwiazdki tez sie kompiluje, i wypluwa identyczny kod, > aczkolwiek daje komunikat > call.S:14: Warning: indirect call without `*' > Co najlepsze intel2gas tlumaczy mi to na call table(%eax,4), > co daje komunikat > call.S:14: Warning: scale factor of 4 without an index register > a uruchomienie programu konczy sie segfaultem. > > Ponizej przyklad potwierdzajacy wariant z gwiadka, tak dla > potomnosci. Jakby komus nie dzialalo, dajcie znac. No to daję znać. Dwa ostrzeżenia są o brak rejestru indeksowego (i słusznie). Po uruchomieniu wyświetla się "f1", a program umiera od segfaulta. Po poprawieniu instrukcji call *functable(%eax,4) na call *functable(,%eax,4) działa, wyświetlają się oba napisy. Pewnie nie ten program wkleiłeś :) Makefile fajny, po przestudiowaniu zachowam sobie :) Ale GNU Make ustawia automatycznie sporo zmiennych, w tym CC, więc to nie jest tu potrzebne. Dodałbym jeszcze tylko ".DUMMY: all clean". -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Forum o programowaniu: http://programista.xorg.pl
Re: AT&T i call
Author: Lopez
Date: Mon, 06 Feb 2006 13:01
Date: Mon, 06 Feb 2006 13:01
52 lines
2836 bytes
2836 bytes
Użytkownik "Bogdan (bogdro)" napisał w wiadomości... > Lopez napisał(a): > > Bez gwiazdki tez sie kompiluje, i wypluwa identyczny kod, > > aczkolwiek daje komunikat > > call.S:14: Warning: indirect call without `*' > > Co najlepsze intel2gas tlumaczy mi to na call table(%eax,4), > > co daje komunikat > > call.S:14: Warning: scale factor of 4 without an index register > > a uruchomienie programu konczy sie segfaultem. > > > > Ponizej przyklad potwierdzajacy wariant z gwiadka, tak dla > > potomnosci. Jakby komus nie dzialalo, dajcie znac. > > No to daję znać. Dwa ostrzeżenia są o brak rejestru indeksowego (i > słusznie). Po uruchomieniu wyświetla się "f1", a program umiera od > segfaulta. Po poprawieniu instrukcji > call *functable(%eax,4) > na > call *functable(,%eax,4) > działa, wyświetlają się oba napisy. Pewnie nie ten program wkleiłeś :) Racja, oczywiscie ze chodzi o call *functable(,%eax,4) Ten testowalem jako ostatni i zapomnialem poprawic. Dzieki > Makefile fajny, po przestudiowaniu zachowam sobie :) Ale GNU Make > ustawia automatycznie sporo zmiennych, w tym CC, więc to nie jest tu > potrzebne. Zmienna CC zazwyczaj domyslnie wskazuje na cc, ja natomiast uzywam roznych kompilatorow, a tu sie je wygodnie zmienia. Mam jeszcz takie male usprawnienie do tego makefile, wtedy dziala prawie bezobslugowo, bo sam tworzy liste plikow. OBJS = $(patsubst %.S,%.o,$(wildcard *.S)) OBJS += $(patsubst %.c,%.o,$(wildcard *.c)) Oczywiscie nie zawsze to sie musi sprawdzac. Aktualnie pracuje nad wersja ktora bedzie mi takze przegladac podkatalogi. Wtedy nie musialbym w kazdym z nich umieszczac dodatkowego makefila. > Dodałbym jeszcze tylko ".DUMMY: all clean". Hmm... a co mi da ta linijka? Nie moge tego w manualu znalezc. Mozna by sie zabezpiczyc tak ".PHONY all clean" ale DUMMY, pierwszy raz widze. -- Pozdrawiam Lopez
Re: AT&T i call
Author: Bogdan (bogdro)
Date: Mon, 06 Feb 2006 14:22
Date: Mon, 06 Feb 2006 14:22
46 lines
2757 bytes
2757 bytes
Lopez napisał(a): > Zmienna CC zazwyczaj domyslnie wskazuje na cc, ja natomiast > uzywam roznych kompilatorow, a tu sie je wygodnie zmienia. Domyślnie wskazuje na domyślny kompilator systemu. W DOSie mi wskazuje na gcc (bo mam DJGPP), w Linuksie - na cc. Ale ten ficzer make'a się przydaje, np. W Linuksie CXX=g++, a w DOSie CXX=gpp i nie trzeba zmieniać Makefile'ów. Podobny efekt i tak można uzyskać inaczej, wykombinowałem ostatnio takie coś: ifeq (($(findstring $(MAKE),exe),$(MAKE)) ROZ_EXE = .exe > Mam jeszcz takie male usprawnienie do tego makefile, wtedy dziala > prawie bezobslugowo, bo sam tworzy liste plikow. > > OBJS = $(patsubst %.S,%.o,$(wildcard *.S)) > OBJS += $(patsubst %.c,%.o,$(wildcard *.c)) Zachowane do dalszej analizy. :) > Oczywiscie nie zawsze to sie musi sprawdzac. > Aktualnie pracuje nad wersja ktora bedzie mi takze przegladac > podkatalogi. Wtedy nie musialbym w kazdym z nich umieszczac > dodatkowego makefila. Sprytne. Myślę, że można to jakoś shellem załatwić. Zgadując: $(find -name "*.c") $(find | egrep "(\.c$)|(\.S$)") ale nie chce mi się na razie dalej o tym myśleć. Na pewno sobie poradzisz :) >> Dodałbym jeszcze tylko ".DUMMY: all clean". > > Hmm... a co mi da ta linijka? Nie moge tego w manualu znalezc. > Mozna by sie zabezpiczyc tak ".PHONY all clean" ale DUMMY, > pierwszy raz widze. Hmm. Chyba rzeczywiście chodziło o PHONY ;) Nie wiem, gdzie to DUMMY widziałem. A może to tylko moja nie do końca zdrowa wyobraźnia. ;) -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Forum o programowaniu: http://programista.xorg.pl
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads