Skocz do zawartości

[Delphi] IntToHex


kompustelnik

Polecane posty

Otóż IntToHex źle mi działa...

 

...
var
W: String;
begin
 W:= IntToHex(Adres, 2);
 ...
end;

 

Zwraca mi wartość 3 cyfrową. Jak przeglądałem helpa Delphi to jest tam konkretny przykład i podane jest "IntToHex(..., 2)". Według ich założeń powinno działać dobrze. U mnie jest jakoś inaczej..

 

Wie ktoś co może być nie tak?

 

Pozdrawiam! ;)

Pisze programy na zlecenia. Tanio!

Delphi, Pascal.

Kontakt:

- (gg) 736483

- (email) kondor20@op.pl light92@o2.pl

- Strona domowa

Wszystko do uzgodnienia.

Link do komentarza
Udostępnij na innych stronach

OOOooo FAK... Racja. Głupi błąd.

 

Więc może ktoś mi wyjaśni pewną kwestię.

 

Pliki COM są ładowane do pamięci pod adres 100h (256).

Ja się bawię w komendę JMP(#$EB). Należy podać jeszcze adres. No to licze sobie z W adres. #$EB przyjmuje wartości poniżej 256.

Jak możliwy jest skok pod ten adres skoro plik COM zaczyna się od 256? Sprawdzałem plik skompilowany NASM'em. I tam adres jest 236.. :blink:

 

Jak mam policzyć adres dla JMP?

Ewentualnie może znacie jakąś inną komendę podobną do JMP?(bardziej normalną)

 

Pozdrawiam! ;)

Pisze programy na zlecenia. Tanio!

Delphi, Pascal.

Kontakt:

- (gg) 736483

- (email) kondor20@op.pl light92@o2.pl

- Strona domowa

Wszystko do uzgodnienia.

Link do komentarza
Udostępnij na innych stronach

No to po kolei:

: z domowych zakamarków wytrzasnąłem starego(bardzo starego) kompa. Chodzi na DOS'ie.

: no to pisze sobie własny dosowy kompilator. I robie procki, albo inaczej etykiety do ktorych mozna skakac poleceniem "goto"(w tym moim programie).

 

GoTo robie za pomocą JMP.

Opkod JMP to #$EB. I przyjmuje adres jedno bajtowy.

256 to już po wyżej jednego bajta.

 

Więc napisałem prosty program w NASM'ie żeby po zdisassemblerowaniu zobaczyć jak tam jest zrobione JMP.

I tam przyjęło adres EC(236).

 

A przeciez pliki COM gdy są ładowane, wczytywane są pod adres 256(org 100h). Więc jakim cudem program działa dobrze jeśli skacze pod adres 236?

To u góry to pierwsze pytanie.

 

Drugie jest takie:

Jak mam sobie policzyć adres dla JMP?

 

Robiłem to w ten sposób:

 

procedure WykonajGoTo(Skok: Integer);
var
S, A1, A2: String;
begin
 S:= IntToHex(Skok, 4);
 A1:= Copy(S, 3, 2);
 A2:= Copy(S, 1, 2);

 Write(ComFile, #$EB, Chr(StrToInt(A1)), Chr(StrToInt(A2)));
end;

 

Powyższy kod jest zły, ponieważ Sam adres waży 2 bajty.

 

Czy ktoś wie w jaki sposób moge sobie policzyć adres?

 

Dodam jeszcze, że Skok > 256.

 

Pozdrawiam! ;)

Pisze programy na zlecenia. Tanio!

Delphi, Pascal.

Kontakt:

- (gg) 736483

- (email) kondor20@op.pl light92@o2.pl

- Strona domowa

Wszystko do uzgodnienia.

Link do komentarza
Udostępnij na innych stronach

po pierwsze primo i najwazniejsze pliki typu COM MUSZA byc full realokowane wiec wszelakie JMP odpadaja bo to jest bezwarunkowy skok do wskazanego adresu. O ile sie nie myle to podaje sie tam pelny adres 32 bitowy. w COM'ie powinienes wywolywac skoki bliskie (niestety nie pamietam mnemonikow do nich) takie ktore mieszcza sie w segmencie czyli max skok to 0xffff. Bardzo dawno w asmie nie pisalem i moze wrzucam tu bzdury (jak tak to niech ktos mnie poprawi) ale wydaje mi sie ze tak to wygladalo...

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Toster i tu się mylisz:

(jakiś banalny przykład)

 

org 100h

start:
    ;walnij tekst
    mov     ah, 09
    mov     dx, naPiS
    int        21h

    ;czekaj na klawisz
    mov     ah, 07
    int        21h

    jmp      start

...

 

To działa jak najbardziej poprawnie.

 

No to nic.. Trzeba kombinować.

 

Dzięki KKKas ;)

btw. Tylko troche nie o to mi chodziło :P

Pozdrawiam! ;)

Pisze programy na zlecenia. Tanio!

Delphi, Pascal.

Kontakt:

- (gg) 736483

- (email) kondor20@op.pl light92@o2.pl

- Strona domowa

Wszystko do uzgodnienia.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...