Asembler łączenie rejestrów

Paweł Olkiewicz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Załóżmy, że mam liczbę w rejestrach EDX:EAX. Jak sprawić, żeby cała była w rejestrze RAX? I w drugą stronę: mam liczbę w rejestrze RAX i chcę ją rozbić na rejestry EDX i EAX. Jak to zrobić?

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
0

Nie piszę w ASM, ale nasuwa się, żeby robić MOV i przesunięcie bitowe, tylko na x86 zdaje się, że MOV do EAX czyści górne bity RAX itd.

Edit. Można zrobić MOV EDX do RAX, przesunąć i zrobić AND z EAX, może jest coś mniej koślawego.
W drugą stronę łatwiej, można zrobić MOV RAX to RDX i przesunąć zawartość w RDX, żeby pozbyć się górnych bitów.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Załóżmy, że mam liczbę w rejestrach EDX:EAX. Jak sprawić, żeby cała była w rejestrze RAX?

Kopiuj
shl rax, 32
shrd rax, rdx, 32

mam liczbę w rejestrze RAX i chcę ją rozbić na rejestry EDX i EAX

Kopiuj
mov rdx, rax
shr rdx, 32

Nie sprawdzane.
W drugim przypadku zostają śmieci w górnej połowie rax, które prawdopodobnie nie zaszkodzą, ale to zależy od tego co dalej z tym zrobisz.
Jeśli potrzebujesz je wyzerować dodaj mov eax, eax.

CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 113
0

Uzupełniając odpowiedź kolegi:
Jak masz EDX i EAX, to możesz w RDX (albo jakimś innym 64-bitowym rejestrze) uzyskać wartość EDX przesuniętą bitowo.
Potem wystaczy zrobić logiczne OR na RAX i tym RDX (oczywiście musisz upewnić się, że górne bity RAX są puste).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.