
- •Преобразование полиз в язык ассемблера
- •Введение
- •Входные данные
- •Модель исполнения полиз
- •Пример:
- •Особенности работы с данными в стеке исполнения
- •Описание перевода элементов полиз в язык ассемблера
- •Пример работы с данными в стеке исполнения
- •Описание перевода операций по работе с метками
- •Описание перевода операций по работе с памятью
- •Исходный код
- •Результат трансляции
- •Результат выполнения
Пример
Исходный код
var
i, n : integer;
sum, x : rational;
begin
read(n);
sum := 0;
for i := 1 to n do begin
x.numerator := 1;
x.denominator := i;
sum := sum + x;
sum := simplify sum;
end;
write(sum);
end.
Результат трансляции
6
sum VAR 2 Nil
x VAR 2 Nil
i VAR 3 Nil
n VAR 3 Nil
true CONST 1 1
false CONST 1 0
------------------------------------
Name |Mode |TypeIdx| Value|
3
boolean NAMED ENUM Ord Nil Nil Nil 0 1 2 4
rational NAMED RAT N-Ord Nil Nil Nil 0 0 N-Ord 8
integer NAMED INT Ord Nil Nil Nil -32768 32767 65536 4
-------------------------------------------------------------------------------
Name |Type |Cons |Ord? |Alias|Idx |Base|LeftB |RightB |Variant|Size |
2
aa01
aa00
------------
Name |
n
@INPUT
sum
0
@ITOR
@SET
i
1
@SET
:aa00
@DEFL
i
n
@<=INT
:aa01
@JMPF
x
@NUMERATOR
1
@SET
x
@DENOMINATOR
i
@SET
sum
sum
x
@ADDRAT
@SET
sum
sum
@SIMPLIFY
@SET
i
@INC
:aa00
@JMP
:aa01
@DEFL
sum
@OUTPUT
Результат выполнения
;
; Generated header of assembly.
;
.386
.model flat, stdcall
option casemap : none
include CompileLib.asm
;
; Generated data segment.
;
_data segment
__variable_n dd 01h dup (0) ; Generated variable 'n'
__variable_sum dd 00h, 01h ; Generated variable 'sum'
__variable_i dd 01h dup (0) ; Generated variable 'i'
__variable_x dd 00h, 01h ; Generated variable 'x'
_data ends
;
; Generated code segment.
;
_text segment
_main proc near
push ebp
mov ebp, esp
pusha
push offset __variable_n ; n
call __input_integer_variable ; @INPUT
add esp, 4
push offset __variable_sum ; sum
push 0 ; 0
__integer_to_rational ; @ITOR
__set_rational_variable ; @SET
push offset __variable_i ; i
push 1 ; 1
__set_integer_variable ; @SET
aa00: ; @DEFL
push offset __variable_i ; i
push offset __variable_n ; n
__evaluate_integer
pop eax
__evaluate_integer
push eax
__less_equals_integer ; @<=INT
pop eax ; @JMPF
cmp eax, 1
jne aa01
push offset __variable_x ; x
__numerator_rational_variable ; @NUMERATOR
push 1 ; 1
__set_integer_variable ; @SET
push offset __variable_x ; x
__denominator_rational_variable ; @DENOMINATOR
push offset __variable_i ; i
push 4 ; @SET
call __copy_memory
add esp, 12
push offset __variable_sum ; sum
push offset __variable_sum ; sum
push offset __variable_x ; x
__evaluate_rational
pop eax
pop ebx
__evaluate_rational
push ebx
push eax
call __add_rational ; @ADDRAT
add esp, 8
__set_rational_variable ; @SET
push offset __variable_sum ; sum
push offset __variable_sum ; sum
__evaluate_rational
call __simplify_rational ; @SIMPLIFY
__set_rational_variable ; @SET
push offset __variable_i ; i
__increment_integer_variable ; @INC
jmp aa00 ; @JMP
aa01: ; @DEFL
push offset __variable_sum ; sum
__evaluate_rational
call __output_rational ; @OUTPUT
add esp, 8
call __output_cr_lf
popa
mov esp, ebp
pop ebp
ret 0
_main endp
_text ends
;
; Generated footer of assembly
;
end _main
; ; Generated data segment. ; _data segment __variable_ia1 db 8 dup (0) ; Generated variable 'ia1' __variable_ra2 dd 12 dup (0, 1) ; Generated variable 'ra2' __variable_ra3 dd 12 dup (0, 1) ; Generated variable 'ra3' __variable_r1 dd 00h, 01h ; Generated variable 'r1' __variable_i1 dd 01h dup (0) ; Generated variable 'i1' __variable_ia3 db 24 dup (0) ; Generated variable 'ia3' __variable_range1 dd 01h dup (0) ; Generated variable 'range1' __variable_ia2 db 24 dup (0) ; Generated variable 'ia2' __variable_enum1 dd 01h dup (0) ; Generated variable 'enum1' __variable_ra1 dd 4 dup (0, 1) ; Generated variable 'ra1' _data ends
|
Сгенерированный сегмент данных на языке ассемблера |