(Created page with "{{TOCright}} == Problema == Considere o seguinte código C++ (assuma que ponteiros e '''int''' ocupam 32 bits e que '''double''' ocupa 64 bits). <source lang="c++"> void s...") |
(→Código Postfix (não optimizado)) |
||
Line 47: | Line 47: | ||
GE | GE | ||
JZ for1end | JZ for1end | ||
+ | LOCAL -4 | ||
+ | LDINT ; i | ||
+ | LOCAL +12 | ||
+ | LDINT ; n | ||
LOCAL +8 | LOCAL +8 | ||
LDINT ; v | LDINT ; v | ||
− | |||
− | |||
− | |||
− | |||
CALL heapify | CALL heapify | ||
TRASH 12 | TRASH 12 | ||
Line 97: | Line 97: | ||
TRASH 8 | TRASH 8 | ||
;-- | ;-- | ||
+ | INT 0 | ||
+ | LOCAL -8 | ||
+ | LDINT ; i | ||
LOCAL +8 | LOCAL +8 | ||
LDINT ; v | LDINT ; v | ||
− | |||
− | |||
− | |||
CALL heapify | CALL heapify | ||
TRASH 12 | TRASH 12 |
Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).
void swap(double *a, double *b);
void heapify(double *v, int n, int i);
void heapSort(double *v, int n) {
for (int i = n / 2 - 1; i >= 0; i--)
heapify(v, n, i);
for (int i = n - 1; i > 0; i--) {
swap(&v[0], &v[i]);
heapify(v, i, 0);
}
}
O código Postfix correspondente ao código C++ é o seguinte (agradece-se a comunicação de questões relativas a este código).
Código Postfix |
---|
EXTERN swap
EXTERN heapify
TEXT
ALIGN
GLOBAL heapSort, FUNC
LABEL heapSort
ENTER 8 ; i@-4 i@-8 v@+8 n@+12
LOCAL +12
LDINT ; n
INT 2
DIV
INT 1
SUB
LOCAL -4
STINT
LABEL for1test
LOCAL -4
LDINT ; i
INT 0
GE
JZ for1end
LOCAL -4
LDINT ; i
LOCAL +12
LDINT ; n
LOCAL +8
LDINT ; v
CALL heapify
TRASH 12
LABEL for1incr
LOCAL -4
LDINT ; i
DUP32
INT 1
SUB
LOCAL -4
STINT ; i--
TRASH 4
JMP for1test
LABEL for1end
LOCAL +12
LDINT ; n
INT 1
SUB
LOCAL -8
STINT
LABEL for2test
LOCAL -4
LDINT ; i
INT 0
GT
JZ for2end
;--
LOCAL +8
LDINT ; v
LOCAL -8
LDINT ; i
INT 8
MUL
ADD ; &v[i]
LOCAL +8
LDINT ; v
INT 0
INT 8
MUL
ADD ; &v[0]
CALL swap
TRASH 8
;--
INT 0
LOCAL -8
LDINT ; i
LOCAL +8
LDINT ; v
CALL heapify
TRASH 12
;--
LABEL for2incr
LOCAL -8
LDINT ; i
DUP32
INT 1
SUB
LOCAL -8
STINT ; i--
TRASH 4
JMP for2test
LABEL for2end
LEAVE
RET
|
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura de 32 bits):
pf2asm code.pf yasm -felf32 code.asm