Resultados da pesquisa a pedido "calling-convention"

1 a resposta

glibc scanf Falha na segmentação quando chamada de uma função que não alinha o RSP

Ao compilar o código abaixo: global main extern printf, scanf section .data msg: db "Enter a number: ",10,0 format:db "%d",0 section .bss number resb 4 section .text main: mov rdi, msg mov al, 0 call printf mov rsi, number mov rdi, format mov ...

2 a resposta

Não é possível entender o exemplo da convenção de chamada do cdecl em que o chamador não precisa limpar a pilha

Eu estou lendo oIDA Pro Book [https://nostarch.com/idapro2.htm]. Na página 86, enquanto discute as convenções de chamada, o autor mostra um exemplo de convenção de chamada cdecl que elimina a necessidade do chamador de limpar argumentos da pilha. ...

1 a resposta

O retorno de uma tupla 2 é menos eficiente que o std :: pair?

Considere este código: #include <utility> #include <tuple> std::pair<int, int> f1() { return std::make_pair(0x111, 0x222); } std::tuple<int, int> f2() { return std::make_tuple(0x111, 0x222); }Os clang 3 e 4 geram código semelhante para ambos no ...

2 a resposta

Por que "mov rcx, rax" é necessário ao chamar printf no assembler x64?

Estou tentando aprender montador x64. Eu escrevi "olá mundo" e tentei chamar printf usando o seguinte código: EXTERN printf: PROC PUBLIC hello_world_asm .data hello_msg db "Hello world", 0 .code hello_world_asm PROC push rbp ; save frame pointer ...

1 a resposta

O lixo é permitido em bits altos de registradores de parâmetro e valor de retorno na ABI do SysV x86-64?

A ABI do x86-64 SysV especifica, entre outras coisas, como os parâmetros de função são passados nos registradores (o primeiro argumento emrdi, entãorsi e assim por diante) e como os valores de retorno inteiro são transmitidos de volta (emrax e ...

2 a resposta

Cada instrução PUSH envia um múltiplo de 8 bytes em x64?

Em x64, cada instrução PUSH envia um múltiplo de 8 bytes? Se não, quanto ele empurra? Além disso, quanto espaço de pilha cada parâmetro de função consome?

1 a resposta

Chamando printf em ASM embutido estendido

Estou tentando gerar a mesma string duas vezes no ASM embutido estendido emGCC, no Linux de 64 bits. int main() { const char* test = "test\n"; asm( "movq %[test], %%rdi\n" // Debugger shows rdi = *address of string* "movq $0, %%rax\n" "push ...

1 a resposta

Escreva um programa Fizz em assembly / Usando a biblioteca C

Alguém poderia me ajudar com este programa de montagem: primeiro imprima os números de 1 a 100. Em seguida, siga as regras do jogo infantil de contagem Fizz: sempre que o número for divisível por 5 ou se contiver o dígito 5, substitua o número ...

2 a resposta

Chamar um ponteiro de função cuja função atribuída possui menos argumentos que o tipo de ponteiro

Considere o seguinte código: #include <iostream> typedef int (*test_func_t) (int, int, int); int print_integer (int a) { std::cout << "num: " << a << "\n"; return a; } int main (int argc, char * argv[]) { test_func_t func = (test_func_t) ...

3 a resposta

convenção de chamada x86: os argumentos transmitidos pela pilha devem ser somente leitura?

Parece que os compiladores de última geração tratam os argumentos passados pela pilha como somente leitura. Observe que na convenção de chamada x86, o chamador envia argumentos para a pilha e o destinatário usa os argumentos na pilha. ...