Assembler IF->THEN

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Assembler IF->THEN

Beitrag von Makke »

Hallo zusammen,

ich habe mich en winziges bisschen mit Assembler beschäftigt um zu wissen ob man bestimmte Abfolgen in einer Prozedur mit Assembler beschleunigen kann.

Beispielsweise versuche ich mich an einer einfachen If...Then Abfrage:

Code: Alles auswählen

Define.l d, n, m, i, j, t
m = 5

For n = 1 To m
  
  i = n*2
  j = m
  
  If i > j
    d = 1
  Else
    d = 0
  EndIf
  
Next

EnableASM

For n = 1 To m
  
  MOV eax,n
  MOV ebx,2
  MUL ebx
  MOV i,eax
  CMP m,eax
  JG l_greater
  JL l_less
  greater:
  MOV d,1
  INT 80h ; = Linux unter Windows sollte es wohl INT 21h sein
  less:
  MOV d,0
  INT 80h ; = Linux unter Windows sollte es wohl INT 21h sein
  
  ;Debug i
  ;Debug m
  ;Debug d

Next
Aber diese Verzweigung/Abfrage funktioniert unter Assembler nicht (bzw. nicht so wie sie soll und ich das verstanden habe). Hat da jemand einen Tip.
---
Windows 11 (64 bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Assembler IF->THEN

Beitrag von STARGÅTE »

Du fragst gerade nur auf größer und kleiner ab, was ist mit Gleich?
Wenn du zu "greater" springst, dann wird "less" trotzdem ausgeführt.
Was soll "INT 80h" sein?
Wozu ist MOV i, eax wenn du i nicht benutzt?

Hier mal n neue Version:

Code: Alles auswählen

For n = 1 To m
	
	MOV eax, n
	MOV ecx, 2
	MUL ecx
	CMP eax, m
	JLE l_lessequal
	MOV d, 1
	JMP l_ifend
	lessequal:
	MOV d, 0 
	ifend:
	
	Debug d
	
Next
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
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Assembler IF->THEN

Beitrag von Makke »

Hi Stargate,

danke für Deine Modifizierung, leider hatte ich das zuvor so auch schon und es funktioniert nicht. Aber zuerst zu Deinen Fragen:

1. INT 80h (unter Linux, unter WIndow soll es INT 21h sein) ist nach dem Anfängertutorial das "End" für Assembler (ein Signal das dem Code sagt hier ist ende).
2. das "i" habe ich für mich zu Debug Zwecken eingebaut.

Hier mal der Code wie ich begonne habe:

Code: Alles auswählen


Define.l d, n, m, i, j, t

m = 5
t = ElapsedMilliseconds()

EnableASM

For n = 1 To m
  
  MOV eax,n
  MOV ebx,2
  MUL ebx
  MOV i,eax
  MOV ecx,m
  MOV j,ecx
  CMP eax,j
  JE  l_equal
  JG  l_greater
  JL  l_less
  equal: 
  MOV d,0
  JMP l_finish
  greater: 
  MOV d,1
  JMP l_finish
  less: 
  MOV d,-1
  finish:
  
  Debug Str(i)+"<->"+Str(j)+"="+Str(d)
  
Next

Debug "ASM Time: "+Str(ElapsedMilliseconds()-t)

DisableASM

t = ElapsedMilliseconds()

For n = 1 To m
  
  i = n*2
  j = m
  
  If i = j
    d = 0
  ElseIf i > j
    d = 1
  Else
    d = -1
  EndIf
  
Next

Debug "PB Time: "+Str(ElapsedMilliseconds()-t)
Aber es funktionierte nicht, deswegen habe ich das ganze verkürzt um der Sache auf den Grund zu kommen. Bei der ersten Konstellation kommt bei mir immer d=1 raus, bei Deinem Code übrigens auch.

Könnte es evtl. an Linux liegen, das da ein Bug ist ?
---
Windows 11 (64 bit)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Assembler IF->THEN

Beitrag von ts-soft »

Das mit dem INT 80h oder noch schlimmer 21h würde ich aber lassen. Das sind IMHO interrupts, die so
nicht mehr unterstützt werden, zumindest im UserSpace.
Softwareinterrupt
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Assembler IF->THEN

Beitrag von STARGÅTE »

@Makke:

Dein Code funktioniert bei mir.
Beachte bitte das du den ASM-Code für x86 geschrieben hast, der nicht unter x64 funktioniert.
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
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Assembler IF->THEN

Beitrag von TheCube »

Unter DOS hat man "früher" sein Programm so verlassen:

Code: Alles auswählen

mov ah,4ch  ; Fkt 4ch nutzen
int 21h  ;Interrupt auslösen 
Eingebettet in PB-Code also nicht zu empfehlen .... INTs also weglassen,
werden eh (wie ts-soft schon schrieb) nicht funktionieren.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Assembler IF->THEN

Beitrag von Helle »

Seit den letzten PB-Versionen (speziell 64-Bit) gilt für ASM-Code: Debugger ausschalten!!! Lasst euch Ergebnisse sonstwie anzeigen (und wenn es der Messagerequester ist). Debug zerstört mittlerweise Register und Flags. Ich hatte da schon etliche Beispiele (z.B. auch XMM-Register).
Ansonsten: Nutzt den (mehr oder weniger) unabhängigen FASM-Code, also "! Instruction...").
INT in Windows-Programmen geht natürlich nicht.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Assembler IF->THEN

Beitrag von Makke »

@Stargate: danke für den Tip 32bit<->64bit, aber daran lag es nicht

@Helle: danke für den Tip mit dem Debugger, daran lag es tatsächlich, wenn ich den Debugger anlasse, kommt kein Ergebnis bzw. immer nur 1 heraus, wenn ich den Debugger ausschalte (und die Ergebnisse in eine Datei speichere) dann kommen die richtigen Ergebnisse.
---
Windows 11 (64 bit)
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Assembler IF->THEN

Beitrag von Martin66119 »

Guten Tag,

ich habe mal auf meinen Netbook den Code getestet.

Statt der beiden Debugzeilen habe ich jeweils
MessageRequester("Zeit",Str(ElapsedMilliseconds()-t), #PB_MessageRequester_Ok) eingefügt.

In Testcode habe ich m= 100000000

Ergebnis:
ASM-Schleife = 2099 ms
PB-Schleife = 1107 ms

Der Debugger ist ausgeschaltet.

Grüße
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Assembler IF->THEN

Beitrag von Danilo »

Martin66119 hat geschrieben:Statt der beiden Debugzeilen habe ich jeweils
MessageRequester("Zeit",Str(ElapsedMilliseconds()-t), #PB_MessageRequester_Ok) eingefügt.

In Testcode habe ich m= 100000000

Ergebnis:
ASM-Schleife = 2099 ms
PB-Schleife = 1107 ms
Der ASM-Code ist ja auch nicht optimiert, eher ein erster Versuch einer 1:1 Übersetzung.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten