Seite 1 von 1
Schleife
Verfasst: 08.01.2005 20:36
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)
Verfasst: 08.01.2005 20:43
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)
Das wollte ich eigentlich nicht
Verfasst: 08.01.2005 20:45
von Martin66119
ich wollte eigentlich den Code in Assembler für eine einfache schleife.
Nicht den Disassemblierten Code einer Exe.
Verfasst: 08.01.2005 20:47
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

Verfasst: 08.01.2005 20:52
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!!
Verfasst: 08.01.2005 21:12
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.
Verfasst: 08.01.2005 22:00
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!