Dúvidas Exercício 4, aula 1 #2

Open
opened 2025-07-07 01:48:37 -03:00 by victor_marinho · 1 comment

Exercício 4 - Aula 1

Alguma dúvidas

Escreva um programa em qualquer linguagem de alto nível que reproduza o funcionamento do exemplo em Assembly.

; Retorna 42 como estado de término

section .text
    global _start

_start:
    mov     rax, 60        ; syscall: exit
    mov     rdi, 42        ; código de saída
    syscall
  • Em C, eu poderia simplesmente escrever?
> #include <stdio.h> 

int main() { 
  syscall(SYS_exit, 42); 
}

Se entendi bem as tabelas de man 2 syscall, eu teria a chamada em rax e i primeiro argumento em rdi, Mas no gdb, tive a saída:

Dump of assembler code for function main:
   0x0000000000001149 <+0>:	endbr64
   0x000000000000114d <+4>:	push   %rbp
   0x000000000000114e <+5>:	mov    %rsp,%rbp
   0x0000000000001151 <+8>:	mov    $0x2a,%esi
   0x0000000000001156 <+13>:	mov    $0x3c,%edi
   0x000000000000115b <+18>:	mov    $0x0,%eax
   0x0000000000001160 <+23>:	call   0x1050 <syscall@plt>
   0x0000000000001165 <+28>:	mov    $0x0,%eax
   0x000000000000116a <+33>:	pop    %rbp
   0x000000000000116b <+34>:	Retorna

Aparentemente, o gcc/clang otimizou o código para registradores de 32bits (Pedi ajuda ao DeepSeek para entender a resposta do gdb);

  • Também poderia escrever?
> 
#include <unistd.h>

int main() {
_exit(42);
}

E tive no gdb:

Dump of assembler code for function main:
   0x0000000000001149 <+0>:	endbr64
   0x000000000000114d <+4>:	push   %rbp
   0x000000000000114e <+5>:	mov    %rsp,%rbp
   0x0000000000001151 <+8>:	mov    $0x2a,%edi
   0x0000000000001156 <+13>:	call   0x1050 <_exit@plt>

Novamente, não foram para os registradores do código em Assembly.

Outra dúvida que surgiu enquanto pesquisava foi:

  • No capítulo 4 do C Programming Language, seção 4.7, temos uma seção bem curta sobre register. Apesar de dizer que pode tornar programas menores e mais rápidos, os autores comentam que somente poucas variáveis podem ser usadas por função e que não é possível obter o endereço de uma variável em registrador. Entendi que esta seção do livro pode estar desatualizada com o passar dos anos. É isso?
# Exercício 4 - Aula 1 ## Alguma dúvidas ### Escreva um programa em qualquer linguagem de alto nível que reproduza o funcionamento do exemplo em Assembly. ~~~assembly ; Retorna 42 como estado de término section .text global _start _start: mov rax, 60 ; syscall: exit mov rdi, 42 ; código de saída syscall ~~~ * Em C, eu poderia simplesmente escrever? ~~~> [!CAUTION] > #include <stdio.h> int main() { syscall(SYS_exit, 42); } ~~~ Se entendi bem as tabelas de _man 2 syscall_, eu teria a chamada em _rax_ e i primeiro argumento em _rdi_, Mas no _gdb_, tive a saída: ~~~bash Dump of assembler code for function main: 0x0000000000001149 <+0>: endbr64 0x000000000000114d <+4>: push %rbp 0x000000000000114e <+5>: mov %rsp,%rbp 0x0000000000001151 <+8>: mov $0x2a,%esi 0x0000000000001156 <+13>: mov $0x3c,%edi 0x000000000000115b <+18>: mov $0x0,%eax 0x0000000000001160 <+23>: call 0x1050 <syscall@plt> 0x0000000000001165 <+28>: mov $0x0,%eax 0x000000000000116a <+33>: pop %rbp 0x000000000000116b <+34>: Retorna ~~~ Aparentemente, o gcc/clang otimizou o código para registradores de 32bits (Pedi ajuda ao DeepSeek para entender a resposta do _gdb_); * Também poderia escrever? ~~~> [!CAUTION] > #include <unistd.h> int main() { _exit(42); } ~~~ E tive no _gdb_: ~~~bash Dump of assembler code for function main: 0x0000000000001149 <+0>: endbr64 0x000000000000114d <+4>: push %rbp 0x000000000000114e <+5>: mov %rsp,%rbp 0x0000000000001151 <+8>: mov $0x2a,%edi 0x0000000000001156 <+13>: call 0x1050 <_exit@plt> ~~~ Novamente, não foram para os registradores do código em Assembly. ### Outra dúvida que surgiu enquanto pesquisava foi: * No capítulo 4 do C Programming Language, seção 4.7, temos uma seção bem curta sobre _register_. Apesar de dizer que pode tornar programas menores e mais rápidos, os autores comentam que somente poucas variáveis podem ser usadas por função e que não é possível obter o endereço de uma variável em registrador. Entendi que esta seção do livro pode estar desatualizada com o passar dos anos. É isso? *

@victor_marinho wrote in #2 (comment):

int main() {
_exit(42);
}

O programa em C que faz sair com estado de término 42 poderia ser também:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    exit(42);
}
@victor_marinho wrote in https://bolha.dev/blau_araujo/pbn/issues/2#issue-31: > int main() { > _exit(42); > } O programa em C que faz sair com estado de término 42 poderia ser também: ```c #include <stdio.h> #include <stdlib.h> int main(void) { exit(42); } ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/pbn#2
No description provided.