Schleife

Für allgemeine Fragen zur Programmierung mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Schleife

Beitrag von Martin66119 »

Leider muss ich nochmals die Frage "wie bekommt man eine Asseblerschleife hin" stellen. Im Moment benutze ich noch die DemoVersion 3.92. Bitte eine Beispielcode, der auch genausolauft

MessageRequester("Info"," Start", 0)

; was muss ich in ASM tun um folgendes hinzubekommen!

for i =1 to 100

next i

MessageRequester("Info"," Stop", 0)
the one and only
Beiträge: 696
Registriert: 26.09.2004 20:17
Kontaktdaten:

Beitrag von the one and only »

In meiner Unendliche Güte habe ich dem dem PureBasic Compiler diese 3 Zeilen Code zu futtern gegeben. Er spuckte folgendes aus:

Code: Alles auswählen

;
; PureBasic x86 v3.92 generated code
;
; (c) 2004 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; Requester
; SimpleList
;
format MS COFF
;
extrn _ExitProcess@4
extrn _GetModuleFileNameA@12
extrn _GetModuleHandleA@4
extrn _HeapAlloc@12
extrn _HeapCreate@12
extrn _HeapDestroy@4
extrn _HeapFree@12
extrn _SetCurrentDirectoryA@4
;
extrn _PB_FreeSimpleLists@0
extrn _PB_InitRequester@0
extrn _PB_InitSimpleList@0
extrn _PB_MessageRequester2@12
extrn _memset
extrn _SYS_FreeStructureStrings@8
extrn PB_FreeArray
extrn PB_FreeStringStructuredArray
extrn SYS_AllocateString
extrn SYS_FastAllocateString
extrn SYS_FastAllocateStringFree
extrn SYS_FreeString
extrn SYS_CopyString
extrn SYS_StringEqual
extrn SYS_StringSup
extrn SYS_StringInf
public PB_NullString
;
public _PB_Instance
public _PBV_ExecutableType
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions
public _PB_StringBase
public PB_StringBase
public _PB_DEBUGGER_LineNumber
public _PB_DEBUGGER_IncludedFiles
macro    align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro bssalign value { rb (value-1) - ($-_PB_BSSSection  + value-1) mod value }
public _WinMain@16
;
section '.text' code readable executable
;
;
_WinMain@16:
;
  PUSH   dword I_BSSEnd-I_BSSStart
  PUSH   dword 0
  PUSH   dword I_BSSStart
  CALL  _memset
  ADD     esp,12
  MOV    eax,[esp+4]
  MOV    [_PB_Instance],eax
  PUSH   dword 0
  PUSH   dword 4000
  PUSH   dword 0
  CALL  _HeapCreate@12
  MOV    [PB_MemoryBase],eax
  CALL  _PB_InitSimpleList@0
  CALL  _PB_InitRequester@0
;
; InitString()
;
  PUSH   dword 64000
  PUSH   dword 8
  PUSH   dword [PB_MemoryBase]
  CALL  _HeapAlloc@12
  MOV    [PB_StringBase],eax
; :
; For i =1 To 100
  MOV    dword [v_i],1
_For1:
  MOV    eax,100
  CMP    eax,dword [v_i]
  JL    _Next2
;
; Next i
_NextContinue2:
  INC    dword [v_i]
  JMP   _For1
_Next2:
;
; MessageRequester("Info"," Stop", 0)
  PUSH   dword 0
  PUSH   dword _S1
  PUSH   dword _S2
  CALL  _PB_MessageRequester2@12
_PB_EOP_NoValue:
  PUSH   dword 0
_PB_EOP:
  CALL  _PB_EndFunctions
  PUSH   dword [PB_MemoryBase]
  CALL  _HeapDestroy@4
  CALL  _ExitProcess@4
_PB_EndFunctions:
  CALL  _PB_FreeSimpleLists@0
  RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
_PB_DEBUGGER_LineNumber: dd -1
_PB_DEBUGGER_IncludedFiles: dd 0
_PBV_ExecutableType: dd 0
_S1: db " Stop",0
_S2: db "Info",0
PB_NullString: db 0
align 4
s_s:
  dd     0
  dd     -1
;
section '.bss' readable writeable
_PB_BSSSection:
bssalign 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_StringBase:
PB_StringBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
bssalign 4
PB_DataPointer rd 1
v_i rd 1
bssalign 4
bssalign 4
bssalign 4
bssalign 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
Allerdings wirst du wahrscheinlich die Vollversion brauchen um das zu Assemblieren (So einfach mi Fasm ohne PB gehts denk ich nicht, das Public Zeugs da wird denk ich beim Reassemblieren (Oder wie das heißt) von Purebasic mit irgendwas verknüpft oder durch Api Calls ersetzt)
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Das wollte ich eigentlich nicht

Beitrag von Martin66119 »

ich wollte eigentlich den Code in Assembler für eine einfache schleife.
Nicht den Disassemblierten Code einer Exe.
the one and only
Beiträge: 696
Registriert: 26.09.2004 20:17
Kontaktdaten:

Beitrag von the one and only »

1. Hab ich deine Frage aber so verstanden
2. Ist der Code nicht disassembliert sondern lediglich der Asm Output von PB
3. Den Code für eine Assembler Schleife hast du ein paar Threads vorher denk ich schonmal gekriegt :mrgreen:
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Beitrag von Martin66119 »

Ja habe ich bekommen. Nur es klappt nicht

;---------------------------------------
; For i= 0 To 20000000
MOV dword [v_i],0
_For1:
MOV eax,20000000
CMP eax,dword [v_i]
JL _Next2
;
; Next i
_NextContinue2:
INC dword [v_i]
JMP _For1
_Next2:
;-------------------------------------------

und das
--------------------------------------------
mov ecx, 2000000 ;oder ne andere Zahl
dein_label:
;mache hier was du willst
loop
_________________________________

habe ich bekommen.
Wenn ich das aber eintippe gehts nicht.

Was mache ich falsch!!
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

du machst das falsch, dass du einfach vorher keine genauen Angaben zur Exe machst. ASM != Programm. Du musst vorher noch genau angeben um was für ein EXE Format es sich handelt.
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

MOV cx,100
SCHLEIFE: ;hier das, was 100-mal durchgeackert werden soll
DEC cx
JNZ l_schleife

Über die Demo-Version kann ich keine Aussage machen.
Bei Compiler-Optionen ASM zuschalten.
Kleinschreibung bei JNZ beachten!
Antworten