.


:




:

































 

 

 

 





:

. . -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;





:


: 2017-01-28; !; : 339 |


:

:

. .
==> ...

1432 - | 1398 -


© 2015-2024 lektsii.org - -

: 0.041 .