:
. . -102
..
:
..
, 2004
.
, , . . . .
, . , () . , , .
.
, . , . .
, , . , .
; , . , , , . , , .. , , , .. .
, , , , . , . , , , , , .
|
|
1
Pascal . :
+, , *, div, mod;
;
;
;
;
:
;
, , , ;
2
, . . , . 2 .
3
. ( ) . , , , . , , .asm
, , :
:
_
:
:
program ;
:
var : integer;
;
:
function : integer;
:
(var : integer)
,
;
:
begin end.
:
;
exit;
:
:
()
,
:
: = ;
:
:
( )
:
+
-
*
mod
div
:
begin end;
:
;
:
:
; ---- primitive asm code generator (.pas to.asm)
;include procedure call and expression enterpriter
|
|
.386
.model flat, stdcall
option casemap:none
include masm32.inc
includelib lib1.lib
includelib masm32.lib
ExitProcess PROTO:DWORD
outdec PROTO:DWORD
__codeblock000 PROTO
__codeblockXXX PROTO
.data
out_ db 200 dup (0)
real_ db 200 dup (0)
nl_ db 0Dh, 0Ah, 00h
nul_ db 30h, 00h
mm_ db '-', 00h
.code
outdec proc NUM:DWORD
pusha
push es
push ds
pop es
lea edi, out_
mov eax, NUM
cmp eax, 0
jl _otr
jne _ok
invoke StdOut, offset nul_
ret
_otr:
invoke StdOut, offset mm_
ret
_ok:
xor ebx, ebx
mov bl, 10
xor ecx, ecx
;===
cld
ll:
cmp eax, 0
jle ex
xor edx, edx
div ebx
xchg eax, edx
add al, 30h
stosb
mov al, 00h
stosb
xchg eax, edx
jmp ll
ex:
invoke StdOut, edi
sub edi, 2
cmp edi, offset out_
jge ex
;===
pop es
popa
ret
outdec endp
EntryPoint:
mov ebp, esp
sub esp, 20; vars to block 0
call __codeblock000
invoke ExitProcess,0
__codeblock000 proc
ret
__codeblock000 endp
END EntryPoint
. .
4
typedef enum {
typenspace,
typevar,
typeconst,
typefunc
} IdentTypes;
typedef struct __typeGIT
{ char * name;
IdentTypes type;
unsigned int ext;
unsigned long value;
unsigned int level;
} typeGIT, * lpGIT;
typedef struct __typeBlock
{ int slPos, swPos; //
int elPos, ewPos; //
int GITidx; // IDT
int GITend; // IDT
lpdgram * code;
} typeBlock, *lpBlock;
typedef enum
{ opset,
opcall,
opadd,
opsub,
opdiv,
opmul,
opmod,
opvar,
opconst,
op_count, //endline & count of ops
op_error,
opignore,
opret,
opneg
} operations;
typedef struct __dgram
{ operations type;
int ext;
struct __dgram * left, * right;
} typedgram, *lpdgram;
char *** GCode;
int lPos;
int wPos;
typeGIT * GIT;
int GIT_size;
typeBlock * Block;
int Block_size;
int Block_cur;
BOOL _stop;