Pular para o conteúdo

Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)

Este pequeno programa em Assembly tem uma antiga versão em formato de 32 bits:

http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-octal-na-tela-em-Assembly-Puro-para-Linu...

Esta versão está no formato 64 bits, para criação de objeto e linkedição em formato ELF64.

Semelhante à primeira versão, este código utiliza-se da pilha para a reordenação dos dígitos após as divisões sucessivas.

Também escrito para usar variáveis globais, não tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e uma visão intuitiva do programa.

Conforme os restos das divisões são obtidos, serão empilhados, sendo acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, vulgo ponteiro - para o dígito que deve ser impresso.

Conforme são desempilhados os valores, os dígitos vão sendo impressos.

O último item a ser desempilhado é um ponteiro para o "new line" armazenado ao final do código.

Este caractere identifica o final da escrita dos dígitos, feita através de um cmp (comparação).

As diferenças entre a versão de 32 bits e a de 64 bits ficam visíveis no uso das interrupções, chamadas de interrupções e registradores.

- Interrupção de escrita 32 bits: 4
- Interrupção de escrita 64 bits: 1

- Interrupção de encerramento 32 bits: 1
- Interrupção de encerramento 64 bits: 60

- Chamada de interrupção 32 bits: "int 0x80"
- Chamada de interrupção 32 bits: "syscall"

- Registradores usados no código com interrupções de 32 bits: eax. ebx, ecx, edx
- Registradores usados no código com interrupções de 64 bits: rax. rdi, rsi, rdx

No caso dos registradores, percebe-se que em 64 bits houve uma pequena mudança na analogia usual.
Perfil removido removido
Hits: 2.351 Categoria: C/C++ Subcategoria: Assembly
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Este pequeno programa em Assembly tem uma antiga versão em formato de 32 bits:

http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-octal-na-tela-em-Assembly-Puro-para-Linu...

Esta versão está no formato 64 bits, para criação de objeto e linkedição em formato ELF64.

Semelhante à primeira versão, este código utiliza-se da pilha para a reordenação dos dígitos após as divisões sucessivas.

Também escrito para usar variáveis globais, não tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e uma visão intuitiva do programa.

Conforme os restos das divisões são obtidos, serão empilhados, sendo acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, vulgo ponteiro - para o dígito que deve ser impresso.

Conforme são desempilhados os valores, os dígitos vão sendo impressos.

O último item a ser desempilhado é um ponteiro para o "new line" armazenado ao final do código.

Este caractere identifica o final da escrita dos dígitos, feita através de um cmp (comparação).

As diferenças entre a versão de 32 bits e a de 64 bits ficam visíveis no uso das interrupções, chamadas de interrupções e registradores.

- Interrupção de escrita 32 bits: 4
- Interrupção de escrita 64 bits: 1

- Interrupção de encerramento 32 bits: 1
- Interrupção de encerramento 64 bits: 60

- Chamada de interrupção 32 bits: "int 0x80"
- Chamada de interrupção 32 bits: "syscall"

- Registradores usados no código com interrupções de 32 bits: eax. ebx, ecx, edx
- Registradores usados no código com interrupções de 64 bits: rax. rdi, rsi, rdx

No caso dos registradores, percebe-se que em 64 bits houve uma pequena mudança na analogia usual.
Download oct_64-001.asm Enviar nova versão

Esconder código-fonte

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       Comentários:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;   nasm -f elf64 oct_64-001.asm
;   ld -s oct_64-001.o -o oct_64-001
;   a opção -s no linkeditor faz
;    "strip -s" automaticamente
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .text
global      _start

_start:

    push    nl
    mov     rax,    valor

_empilha:

    xor     rdx,    rdx
    mov     rcx,    8
    div     rcx
    add     rdx,    digit
    push    rdx
    cmp     rax,    0
    jg      _empilha

_escreve:

    mov     rax,    1
    mov     rdi,    1
    pop     rsi
    mov     rdx,    1
    syscall

    cmp     rsi,    nl
    jne     _escreve

_fim:

    mov     rax,    60
    mov     rdi,    0
    syscall

section     .rodata

    digit   dq  "01234567"
    nl      dq  `\n`
    valor   equ 4952488

Fatorial Assembly MIPS

Ano bissexto em assembly

Assembler 8086 - Simples código que mostra horas e minutos em pontos

GAS Informações do sistema

"Clear Screen" para Linux x86 em Assembly Puro (Nasm - Netwide Assembler)

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.