🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
11 messages
11 total messages Started by Lopez Sun, 05 Feb 2006 17:33
AT&T i call
#102
Author: Lopez
Date: Sun, 05 Feb 2006 17:33
17 lines
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
#103
Author: Bogdan (bogdro)
Date: Sun, 05 Feb 2006 19:19
31 lines
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
#104
Author: Bogdan (bogdro)
Date: Sun, 05 Feb 2006 20:10
43 lines
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
#108
Author: Lopez
Date: Sun, 05 Feb 2006 21:49
84 lines
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
#105
Author: Lopez
Date: Sun, 05 Feb 2006 21:59
48 lines
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
#112
Author: Wiktor S.
Date: Sun, 05 Feb 2006 22:00
10 lines
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
#106
Author: Wiktor S.
Date: Sun, 05 Feb 2006 22:03
26 lines
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
#107
Author: Lopez
Date: Sun, 05 Feb 2006 22:34
23 lines
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
#109
Author: Bogdan (bogdro)
Date: Mon, 06 Feb 2006 12:00
29 lines
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
#110
Author: Lopez
Date: Mon, 06 Feb 2006 13:01
52 lines
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
#111
Author: Bogdan (bogdro)
Date: Mon, 06 Feb 2006 14:22
46 lines
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