ASM - Multiplikation zweier 64Bit register

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

ASM - Multiplikation zweier 64Bit register

Beitrag von STARGÅTE »

Hallo Leute,

irgendwie stelle ich mich zu blöd an die Suche hier, als auch Google zu benutzen.
Was ich suche, ist "den" ASM Befehl (und die Register), mit dem ich zwei 64-Bit Register miteinander multiplizieren kann und das Ergebnis dann in zwei 64-Bit Register gepackt wird.
Also ählich wie hier, wenn ich zwei Longs multipliziere und das Ergebnis dann in zwei 32-Bit Registern steht:

Code: Alles auswählen

*A = AllocateMemory(4)
*B = AllocateMemory(4)
*C = AllocateMemory(4+4)
PokeL(*A, $03000002)
PokeL(*B, $03000002)
! MOV ecx, [p_A]
! MOV eax, [ecx]
! MOV ecx, [p_B]
! MUL dword [ecx]
! MOV ecx, [p_C]
! MOV [ecx], eax
! MOV [ecx+4], edx
ShowMemoryViewer(*C, 4+4)
Wäre natürlich gut, wenn einer mir auch einen Link zeigen könnte, wo ich ähnliche Befehle für addieren und dividieren finde. Das ganze soll halt für 64Bit optimiert sein.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ASM - Multiplikation zweier 64Bit register

Beitrag von STARGÅTE »

Oke, scheinbar funktionieren die Befehle auch für 64-Bit, und ich muss nur die Register umbenennen, habe ich da recht?

64Bit-Code:

Code: Alles auswählen

*A = AllocateMemory(8)
*B = AllocateMemory(8)
*C = AllocateMemory(8+8)
PokeQ(*A, $0300000000000002)
PokeQ(*B, $0300000000000002)
! MOV rcx, [p_A]
! MOV rax, [rcx]
! MOV rcx, [p_B]
! MUL qword [rcx]
! MOV rcx, [p_C]
! MOV [rcx], rax
! MOV [rcx+8], rdx
ShowMemoryViewer(*C, 8+8)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ASM - Multiplikation zweier 64Bit register

Beitrag von mk-soft »

Besser die r14, r15 register nehmen. Führt sonst zu fehlern.

purebasic.asm

Auszug...

Code: Alles auswählen

; a.q = 4
  MOV    qword [v_a],4
; b.q = 2
  MOV    qword [v_b],2
; 
; c.q = a * b
  MOV    r15,qword [v_a]
  IMUL   r15,qword [v_b]
  MOV    qword [v_c],r15
; 
; Debug c
;
Eine Multiplikation ist eine Addition Shift-Left.

Habe das hier für 32bit gefunden...
http://www.dreamincode.net/forums/topic ... s-part-ii/

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ASM - Multiplikation zweier 64Bit register

Beitrag von STARGÅTE »

Die angabe des Zielparameters geht aber nur in IMUL, ich brauche aber MUL, und dort ist das Ziel immer DX-AX.
Besser die r14, r15 register nehmen. Führt sonst zu fehlern.
Was für "Fehler"?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten