21.5 C
Brasília
quinta-feira, novembro 28, 2024
Continua após a publicidade..

Invertendo uma árvore binária usando montagem x64

Enquanto navegava no twitter, me deparei com este tweet:

Tweet asking you to invert merkle tree

Desafio aceito

Algumas regras básicas

A tarefa é inverter uma árvore binária. Um nó de árvore binária é definido da seguinte forma:

structTweet asking you to invert merkle tree TreeNode{ Tweet asking you to invert merkle tree

int

val; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

estrutura

TreeNode

* deixei; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

estrutura

Treenode

* certo; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

}; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Esta definição é de Leetcode 226. Depois que terminarmos, podemos enviar nosso código para lá para ver se funciona.

Estarei usando o assembly x64 com a sintaxe AT&T como está objetivamente superior à sintaxe da Intel.

Tecnicamente, o tweet pede para inverter uma árvore merkle, no entanto, você pode facilmente estender o código final para recalcular o hash em cada nó após suas duas subárvores serem invertidas.

Pseudocódigo

A função que precisamos implementar é a seguinte:

structTweet asking you to invert merkle tree TreeNode * invertTree(
struct
TreeNode
* root); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Começaremos escrevendo algum pseudocódigo

NULL, e se é, retornamos NULL. 

 1 Tweet asking you to invert merkle tree
2
3
4 Tweet asking you to invert merkle tree
5 Tweet asking you to invert merkle tree 6 Tweet asking you to invert merkle tree
7
8
9 Tweet asking you to invert merkle tree
10 Tweet asking you to invert merkle tree11 Tweet asking you to invert merkle tree
12
13
14 Tweet asking you to invert merkle tree

funçãoTweet asking you to invert merkle tree invertido(raiz) { Tweet asking you to invert merkle tree

deixar

local_rootTweet asking you to invert merkle tree = root; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree E se local_root é nulo { Tweet asking you to invert merkle tree

Retorna nulo Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

} Tweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

letTweet asking you to invert merkle tree local_left

=Tweet asking you to invert merkle tree local_rootTweet asking you to invert merkle tree.deixei; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree deixar local_right

=Tweet asking you to invert merkle tree

local_rootTweet asking you to invert merkle tree.certo; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

raiz.certo = inverterTweet asking you to invert merkle tree(local_left); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree raiz.deixei

=Tweet asking you to invert merkle tree invertido(local_rightTweet asking you to invert merkle tree); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Retorna local_rootTweet asking you to invert merkle tree; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

} Tweet asking you to invert merkle tree

Este pseudocódigo é intencionalmente detalhado para que possamos rastrear facilmente todas as variáveis ​​locais que temos que criar e armazenar na pilha. Estaremos traduzindo este pseudocódigo como é para assembly.

Configuração básica

As linhas 1 e 2 informam ao montador que estamos definindo um invert_tree símbolo do tipo função. O globl permite que nossa função seja chamada de outros arquivos de origem. O texto é o Segmento de código onde estaremos escrevendo nossa função.

Função prólogo e epílogo

Para definir esta função em assembly, primeiro precisamos entender a convenção de chamada x86-64. Isso está documentado no System V ABI disponível

aqui.

1 Tweet asking you to invert merkle tree2 Tweet asking you to invert merkle tree
3
4 Tweet asking you to invert merkle tree5 Tweet asking you to invert merkle tree

.globl

invert_tree Tweet asking you to invert merkle tree

.modelo invert_tree, @functi sobre

.seção .texto Tweet asking you to invert merkle tree

invert_tree: Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

# Nossa função vai aqui Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

1 Tweet asking you to invert merkle tree2 Tweet asking you to invert merkle tree
3
4 Tweet asking you to invert merkle tree5 Tweet asking you to invert merkle tree6 7 Tweet asking you to invert merkle tree
8
9 Tweet asking you to invert merkle tree

invert_tree: Tweet asking you to invert merkle tree 
# Função prólogo
Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Empurre %rbp Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
movTweet asking you to invert merkle tree %rsp, %rbp 

Tweet asking you to invert merkle tree

subTweet asking you to invert merkle tree $32Tweet asking you to invert merkle tree, %rsp Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

# Função epílogo Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

sair Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

retTweet asking you to invert merkle tree Tweet asking you to invert merkle tree

Primeiro, colocamos o valor atual de %rbp na pilha e copie %rsp para %rbp. Em seguida, subtraímos 32 bytes do ponteiro da pilha para liberar espaço para armazenar nossas variáveis ​​locais.

Fazer isso configura um quadro de pilha para esta função, com %rbp

como a “base” . Agora podemos usar compensações de %rbp para acessar os dados na pilha.

Existe um enter instrução que configura o quadro de pilha para nós, mas é muito lento. Em processadores modernos digite decodifica para cerca de 10 a 20 µops, enquanto a sequência de três instruções é de cerca de 4 a 6, dependendo da arquitetura. Fonte

O sair a instrução faz exatamente o oposto das linhas 3

e 4. Restaura %rsp e coloca o valor da pilha em

%rbp. Alinhamento da pilha

Em nosso pseudocódigo, existem 3 variáveis ​​locais local_root, local_left e local_right. Cada um deles é um tipo de ponteiro, portanto, eles requerem um total de 24 bytes para serem armazenados na pilha (um tipo de ponteiro tem tamanho de 8 bytes em x64).

No entanto, em vez disso, abrimos espaço para 32 bytes para garantir que nossa pilha esteja “alinhada” corretamente. Do documento System V ABI:

“A pilha precisa ter 16 byte alinhado imediatamente antes de qualquer instrução de chamada ser executada.”

Caso base

A função aceita um único ponteiro como entrada, portanto conforme a convenção de chamada, estaremos recebendo como valor de 64 bits no registrador %rdi.

Para retornar um ponteiro da nossa função, temos que armazená-lo no registrador %rax antes de nós ret da nossa função.

Verificamos se a raiz é

Em x64, NULL é o valor 0. Comparamos %rdi com 0 e se for bem sucedido, colocamos 0 dentro %rax e retornar da nossa função. Para fazer isso, usando xor é mais rápido que mov ou sub.

Alinhamento da estrutura

Na maioria dos ISAs, cada tipo de dado em uma estrutura tem um requisito de alinhamento. O que isso significa é que o endereço de um tipo deve começar em um endereço que seja múltiplo de seu tamanho. (Existem algumas exceções, mas esta é a regra geral)

Então int devem começar em um endereço que seja múltiplo de 4, e os ponteiros devem começar em um endereço que seja um múltiplo de 8.

Dado isso, nossa estrutura original é disposta na memória mais ou menos assim:

Isso desperdiça 4 bytes para cada struct na memória. Podemos economizar esse espaço declarando os ponteiros primeiro, porém continuaremos a usar a declaração struct original, pois queremos enviar isso para o Leetcode.

Armazenando variáveis ​​locais na pilha

Assim que soubermos os deslocamentos de endereço em nossa estrutura, podemos armazená-los na pilha. Vamos armazenar local_root, ponteiros esquerdo e direito na pilha. Cada um deles tem um tamanho de 8 bytes. Nós os armazenamos da seguinte maneira

 
1 Tweet asking you to invert merkle tree 2 Tweet asking you to invert merkle tree
3 Tweet asking you to invert merkle tree 4
5 Tweet asking you to invert merkle tree
6 Tweet asking you to invert merkle tree 7 Tweet asking you to invert merkle tree
8 Tweet asking you to invert merkle tree
9
10 Tweet asking you to invert merkle tree
11 Tweet asking you to invert merkle tree12 Tweet asking you to invert merkle tree
13 Tweet asking you to invert merkle tree14
15 Tweet asking you to invert merkle tree
16 Tweet asking you to invert merkle tree17 Tweet asking you to invert merkle tree
18 Tweet asking you to invert merkle tree19
20

invert_tree : Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

#Função prólogo Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree pushTweet asking you to invert merkle tree %rbp Tweet asking you to invert merkle tree

movTweet asking you to invert merkle tree %rsp , %rbp Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

subTweet asking you to invert merkle tree

$32

, %rsp Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

# --------- Base caso --------- Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree # %rdi contém o inp parâmetro ut (ponteiro de 8 bytes para a raiz)

Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree cmpTweet asking you to invert merkle tree $0Tweet asking you to invert merkle tree, %rdi Tweet asking you to invert merkle tree

# Root not NULL, continue com a execução

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree jne Prosseguir Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

# Root é NULL, armazene NULL em %rax e retorne

Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree xorTweet asking you to invert merkle tree %rax, %rax

jmpTweet asking you to invert merkle tree feito

Tweet asking you to invert merkle tree

Prosseguir:

Tweet asking you to invert merkle tree

feito:

# Função epílogo Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

sair Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

ret Tweet asking you to invert merkle tree

localização início

local final

 
%rbp
Variável
local_root %rbp - 8
%rbp - 8
local_left %rbp - 16

%rbp - 16

local_right %rbp - 24

Além disso, para facilitar a referência a eles, podemos definir esses deslocamentos como constantes usando o eq diretiva do montador.

1
2 Tweet asking you to invert merkle tree

3 Tweet asking you to invert merkle tree4 Tweet asking you to invert merkle tree

5 Tweet asking you to invert merkle tree

6

7 Tweet asking you to invert merkle tree

8 Tweet asking you to invert merkle tree

Nós ca n então use-os em nosso código.

# ... Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree.seção .texto
Tweet asking you to invert merkle tree
.equTweet asking you to invert merkle tree local_rootTweet asking you to invert merkle tree, -8Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree
.equiTweet asking you to invert merkle tree local_leftTweet asking you to invert merkle tree, -16 Tweet asking you to invert merkle tree
.equiTweet asking you to invert merkle tree local_rightTweet asking you to invert merkle tree, -24 Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree
Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
invert_tree:
Tweet asking you to invert merkle tree
# ... função aqui
Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

1 Tweet asking you to invert merkle tree
2
3 Tweet asking you to invert merkle tree 4 Tweet asking you to invert merkle tree 5 Tweet asking you to invert merkle tree
6 Tweet asking you to invert merkle tree
7
8 Tweet asking you to invert merkle tree 9 Tweet asking you to invert merkle tree10 Tweet asking you to invert merkle tree
11 Tweet asking you to invert merkle tree
12
13 Tweet asking you to invert merkle tree 14 Tweet asking you to invert merkle tree15 Tweet asking you to invert merkle tree
16 Tweet asking you to invert merkle tree
17
18 Tweet asking you to invert merkle tree 19
invert_tree:
Tweet asking you to invert merkle tree
# ...
Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Prosseguir:
Tweet asking you to invert merkle tree
# --------- Salvar variáveis ​​locais na pilha --------- Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree # Salve o parâmetro raiz como local_root na pilha Tweet asking you to invert merkle tree
Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree %rdi, local_rootTweet asking you to invert merkle tree(%rbp) Tweet asking you to invert merkle tree
Tweet asking you to invert merkle tree
# Avance 8 bytes da raiz, para obter o ponteiro esquerdo na estrutura. Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree
8
(%rdi), %rdx Tweet asking you to invert merkle tree
# Armazene isso como local_left para empilhar Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
movq
%rdx,
local_left(% rbp) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree
# Avance 16 bytes da raiz, para chegar ao ponteiro certo em struct. Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree 16(%rdi), %rdx Tweet asking you to invert merkle tree
# Armazene isso como local_right para empilhar Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
movq
%rdx,
local_right
(% rbp) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree
feito:
# ... Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree

Faça as chamadas recursivas

Neste ponto, olhando o pseudocódigo, basta realizar 2 chamadas recursivas.

Para isso, armazenamos o parâmetro correto em %rdi e use a chamada instrução.

Para atribuir os resultados das chamadas recursivas, usamos o %rdx registre-se para calcular os endereços corretos de root.left e root. certo. A maior parte disso é uma tradução direta do pseudocódigo.

Enviando para leetcode

Não podemos enviar montagem para Leetcode, então usaremos C em seu lugar. Leetcode usa o gcc para compilar nosso código, então podemos usar o __asm__ para adicionar nosso assembly.

Precisamos também declarar nossa função com

externTweet asking you to invert merkle tree antes de podermos chamá-lo. 
  
1
2 Tweet asking you to invert merkle tree 3 Tweet asking you to invert merkle tree 4 Tweet asking you to invert merkle tree
5 Tweet asking you to invert merkle tree
6
7 Tweet asking you to invert merkle tree 8 Tweet asking you to invert merkle tree 9 Tweet asking you to invert merkle tree
10 Tweet asking you to invert merkle tree
11
12 Tweet asking you to invert merkle tree 13

typedef

struct

TreeNode TreeNode; Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

externo

TreeNode

*

invert_treeTweet asking you to invert merkle tree( TreeNode*); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

__asm__(".global invert_tree ntTweet asking you to invert merkle tree"Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree

".type invert_tree, @function

ntTweet asking you to invert merkle tree

"Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

".seção .texto

nt

"Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree// Resto do nosso código aqui ... Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

// função Leetcode

Tweet asking you to invert merkle tree

TreeNode

*

invertTreeTweet asking you to invert merkle tree(TreeNode* raiz){ Tweet asking you to invert merkle tree

Retorna inverter_tree(raiz); Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

} Tweet asking you to invert merkle tree

E terminamos!

O desempenho e a memória do leetcode os números não são muito confiáveis, então não sabemos realmente o quanto nosso programa é mais rápido em comparação com outros envios, mas suspeito que seja bem rápido.

Conclusão

Esta foi uma excursão divertida para aprimorar minhas habilidades de montagem. Não foi difícil, mas definitivamente foi tedioso (geralmente é assim que me sinto sobre a maioria das questões de estilo leetcode).

Max Howell rejected from Google

Pelo menos agora posso me relacionar com mais memes em

r/ProgrammerHumor

 1 Tweet asking you to invert merkle tree
2
3
4 Tweet asking you to invert merkle tree 5 Tweet asking you to invert merkle tree 6 Tweet asking you to invert merkle tree 7
8 Tweet asking you to invert merkle tree
9
10 Tweet asking you to invert merkle tree
11 Tweet asking you to invert merkle tree12 Tweet asking you to invert merkle tree
13 Tweet asking you to invert merkle tree14
15 Tweet asking you to invert merkle tree
16 Tweet asking you to invert merkle tree17 Tweet asking you to invert merkle tree
18 Tweet asking you to invert merkle tree19
20
21 Tweet asking you to invert merkle tree22 Tweet asking you to invert merkle tree
23 Tweet asking you to invert merkle tree24
25 Tweet asking you to invert merkle tree
26 Tweet asking you to invert merkle tree27 Tweet asking you to invert merkle tree
28 Tweet asking you to invert merkle tree29
30 Tweet asking you to invert merkle tree
31 Tweet asking you to invert merkle tree32 Tweet asking you to invert merkle tree
33 Tweet asking you to invert merkle tree
34
35 Tweet asking you to invert merkle tree 36 Tweet asking you to invert merkle tree37 Tweet asking you to invert merkle tree
38 Tweet asking you to invert merkle tree
39
40 Tweet asking you to invert merkle tree 41 Tweet asking you to invert merkle tree42 Tweet asking you to invert merkle tree
43 Tweet asking you to invert merkle tree
44
45 Tweet asking you to invert merkle tree 46 Tweet asking you to invert merkle tree47 Tweet asking you to invert merkle tree
48 Tweet asking you to invert merkle tree
49
50 Tweet asking you to invert merkle tree 51 Tweet asking you to invert merkle tree52 Tweet asking you to invert merkle tree
53 Tweet asking you to invert merkle tree
54
55 Tweet asking you to invert merkle tree
56 Tweet asking you to invert merkle tree57 Tweet asking you to invert merkle tree
invert_tree: Tweet asking you to invert merkle tree

# Prólogo da função Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree

Empurre %rbp

mov %rsp, %rbp

subTweet asking you to invert merkle tree

 $32Tweet asking you to invert merkle tree, %rsp 

Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

# --------- Caso base --------- Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree # %rdi contém o parâmetro de entrada (ponteiro de 8 bytes para a raiz) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

cmpTweet asking you to invert merkle tree

$0Tweet asking you to invert merkle tree, %rdi

Tweet asking you to invert merkle tree

# Root not NULL, continue com a execução Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree 
jneTweet asking you to invert merkle tree continue Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
# Root é NULL, armazene NULL em %rax e retorne
Tweet asking you to invert merkle treeTweet asking you to invert merkle tree
Tweet asking you to invert merkle tree xorTweet asking you to invert merkle tree %rax, %rax Tweet asking you to invert merkle tree
jmpTweet asking you to invert merkle tree feito
Tweet asking you to invert merkle tree
Prosseguir:

# --------- Salvar variáveis ​​locais na pilha --------- Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree

# Salve o parâmetro raiz como local_root na pilha Tweet asking you to invert merkle tree

movq %rdi, local_root(%rbp ) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree

# Avance 8 bytes da raiz, para obter o ponteiro esquerdo em struct. Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree

8

(%rdi), %rdx Tweet asking you to invert merkle tree

# Armazene isso como local_left para empilhar Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

movq

%rdx,

local_left(% rbp) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree

# Avance 16 bytes da raiz, para chegar ao ponteiro certo em struct. Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree 16(%rdi), %rdx Tweet asking you to invert merkle tree

# Armazene isso como local_right para empilhar Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

movq

%rdx,

local_right

(% rbp) Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree

# --------- Chamadas recursivas --------- Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree # Recursivo y chame invert_tree em local_right Tweet asking you to invert merkle tree

Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree

local_right

(%rbp), %rdi

ligar invert_treeTweet asking you to invert merkle tree Tweet asking you to invert merkle tree Tweet asking you to invert merkle tree

# Calcula o endereço de root.left Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

movqTweet asking you to invert merkle tree local_rootTweet asking you to invert merkle tree(%rbp), %rdx Tweet asking you to invert merkle tree

addqTweet asking you to invert merkle tree $8, %rdx Tweet asking you to invert merkle tree

# Atribui root.left ao valor retornado da chamada recursiva Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree

movq

%rax, (%rdx)

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

#Chamada recursivamente inverter_tree em local_left Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree movqTweet asking you to invert merkle tree

local_left

(%rbp), %rdi

Tweet asking you to invert merkle tree

ligar invert_treeTweet asking you to invert merkle tree Tweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

# Calcular endereço de root.right Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

movqTweet asking you to invert merkle tree local_rootTweet asking you to invert merkle tree(%rbp), %rdx

addqTweet asking you to invert merkle tree $16Tweet asking you to invert merkle tree, %rdx Tweet asking you to invert merkle tree

# Atribui root.right ao valor retornado da chamada recursiva

Tweet asking you to invert merkle tree

movq

%rax, (%rdx)

Tweet asking you to invert merkle tree

# Return root Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Tweet asking you to invert merkle tree movq local_root(%rbp), %rax Tweet asking you to invert merkle tree

Tweet asking you to invert merkle treeTweet asking you to invert merkle treefeito: Tweet asking you to invert merkle tree

# Função epílogo Tweet asking you to invert merkle treeTweet asking you to invert merkle treeTweet asking you to invert merkle tree

sair Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

retTweet asking you to invert merkle tree Tweet asking you to invert merkle treeTweet asking you to invert merkle tree

Check out other tags:

0