64 bitowe rejestry w 32 bitowym programie

64 bitowe rejestry w 32 bitowym programie
0

Dawniej były 16 bitowe programy i mogłem w nich obliczać na 32 bitowych,
były nawet takie wstawki, funkcje 32 bitowe do obróbki dib w 16 bitowych bibliotekach Borlanda.

A teraz są 64 bitowe rejestry i jest ich aż 16,
więc chodzi mi o to czy też można używać 64 bitowych operacji z procesu 32 bitowego?

Wtedy można byłoby robić w zasadzie 64-bitowe programy, w środowisku 32-bit (w Windows 32).

Takie aplikacji byłby przecież szybsze od full 64 !

Nie marnowałby czasu na przewalanie zawsze podwójnych bloków pamięci!
Po co transferować zawsze aż 64 bitowe kęsy na stos, wszystkie wskaźniki również 64, czy nawet 128 w obiektowym...
przecież to istotnie spowalnia działanie.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
0

Nie da się.

SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Da się, do tego jest wstawka "call 33h:nazwa_funkcji_x64" i stare dobre retf. Działa pod windowsem 7.
nazwa_funkcji_x64 jest labelem funkcji 64-bitowej, powinna rezydować pod stosownym adresem, podzielnym przez 16.
Retf kończy funkcję, wraca do 32-bitowego trybu.

edytowany 1x, ostatnio: sapero
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
2

Da się, do tego jest wstawka
To jest odpowiedź na inne pytanie.
Windows x64 musi umieć przełączać tryby, jeśli mają działać programy 32- i 64-bitowe jednocześnie.
Dlatego całkiem możliwe, że da się wykorzystać ten (nieudokumentowany) mechanizm do przełączenia trybu procesora.

Nie o to było pytanie.

Pytający zwraca uwagę, że w trybie 16-bitowym można bezpośrednio odwoływać się do 32-bitowych rejestrów (o ile procesor jest 32-bitowy), i żywi nadzieję, że podobnie da się w 32-bitowym procesie korzystać z 64-bitowych rejestrów, a nawet „można byłoby robić w zasadzie 64-bitowe programy, w środowisku 32-bit (w Windows 32)”.

Na to pytanie odpowiedź jest podwójnie negatywna: nie, nie da się w 32-bitowym procesie zakodować instrukcji operujących na nowych, 64-bitowych rejestrach; oraz nie, nie da się 64-bitowych instrukcji wykonać na 32-bitowym systemie, a sztuczka z call 33h tym bardziej nie zadziała.

Da się:
– przełączyć tymczasowo tryb procesora, w systemie 64-bitowym, jak @sapero pokazał

  • jeśli procesor posiada sprzętową wirtualizację, uruchomić maszynę wirtualną z 64-bitowym systemem nawet na 32-bitowym systemie gospodarzu.
edytowany 2x, ostatnio: Azarien
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
4

Oto wyjaśnienie problemu z dostępnością rejestrów:

16-bitowe rejestry w 32-bitowym procesie, oraz 32-bitowe rejestry w 16-bitowym procesie kodowane są prefixem 66h, dodatkowym bajtem umieszczonym przed kodem właściwej instrukcji. Obecność prefiksu 66h oznacza, że instrukcja operuje na „niewłaściwych” rejestrach (niezgodnych z bieżącym trybem pracy procesora), a jego brak że instrukcja dotyczy „właściwych”, domyślnych rejestrów.

instrukcja bajty w trybie 16-bit bajty w trybie 32-bit
mov ax,bx 89 D8 66 89 D8
mov eax,ebx 66 89 D8 89 D8

W trybie 64-bitowym instrukcje na rejestrach 16- i 32-bitowych są kodowane tak samo jak w trybie 32-bitowym.
Dostęp do rejestrów 64-bitowych uzyskuje się poprzez nowy prefix 48h (właściwie cały zbiór 16 prefiksów, bo niektóre bity kodują dodatkowe informacje)

instrukcja bajty w trybie 16-bit bajty w trybie 32-bit bajty w trybie 64-bit
mov ax,bx 89 D8 66 89 D8 66 89 D8
mov eax,ebx 66 89 D8 89 D8 89 D8
mov rax,rbx - - 48 89 D8

Dlaczego jednak nie można użyć prefiksu 48h w trybach 16- i 32-bitowych?
Dlatego że ma on inne znaczenie: koduje instrukcję dec ax, więc ciąg 48 89 D8 oznaczałby dec ax : mov ax,bx albo dec eax : mov eax,ebx zależnie od trybu.

Ponieważ instrukcję dec ax od zawsze można też zakodować jako dwa bajty FF C8, postanowiono zrezygnować z jednobajtowego wariantu tej instrukcji, a kodowi 48h nadać nowe znaczenie. Podobnie z trybu 64-bitowego wyleciał szereg innych nie używanych instrukcji, jak AAA, AAD i in.

W ten sposób, z powodu zmiany znaczenia niektórych opcode'ów, w trybach 16- i 32-bitowych nie ma żadnej możliwości dostania się do 64-bitowych rejestrów ogólnego przeznaczenia.

edytowany 1x, ostatnio: Azarien
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:2 dni
  • Postów:2964
0

W C++ nie można mieć 32-bitowych pointerów w aplikacji 64-bitowej, jako opcja kompilatora? Pytam z ciekawości. Java taką optymalizację robi domyślnie, jeśli nie potrzebujemy więcej niż 64 GB RAMu.

edytowany 1x, ostatnio: Krolik
02
Jak sobie sam napiszesz to będziesz miał ;) O opcji kompilatora nie słyszałem.
0

W takim razie te 64 bitowce to kolejna porażka... wyścig megalomanów do przepaści. ;)

Znalazłem gdzieś na innym forum podobne pytanie, ale zgubiłem to.

Tam jakiś facio odpalał 64 bitowe programy na systemie 32, ale to nie był Windows, lecz coś innego.

Ale to przełączanie trybów jest skomplikowane - długo to trwa?

No, ale pewnie te pajace z MS zablokowali również i to - wyskoczy jakiś zasrany 'Windows Defender' i po zabawie... hehe!

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
0

W takim razie te 64 bitowce to kolejna porażka... wyścig megalomanów do przepaści.

Spokojnie. Straty na większym rozmiarze wskaźników z pewnością nadrabia się większą ilością rejestrów, co pozwala na rzadsze odwołania do pamięci i przekazywanie parametrów funkcji w rejestrach a nie na stosie.

Wyolbrzymiasz problem ;-)

0

No, ale w systemie 64 można zasuwać tymi rejestrami 64 w 32 bitowej aplikacji.

Nawet ten biedny Windows jakoś musi wyjść z tego trybu WoW64, czyli wejść w tryb 64 z 32, i robić to bardzo szybciutko - pewnie jednym prostym skokiem...

Azarien
przecież @sapero podał jak...
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)