AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78052548
Accepted
SCP-1762
SCP-1762
Asked: 2024-02-24 21:12:18 +0800 CST2024-02-24 21:12:18 +0800 CST 2024-02-24 21:12:18 +0800 CST

Não é possível indexar matrizes em assembly

  • 772

Eu tenho tentado aprender um pouco de montagem e estava testando arrays e descobri que quando tentei imprimir o valor no ponto indexado nada aconteceu, depois de experimentar mais parece que mesmo que eu esteja usando os arrays como mostrado em muitos exemplos na Internet, simplesmente não está funcionando

Aqui está o código:

section .text
    global _start

_start:
    mov eax, num ; eax now contains 5
    mov ebx, [array+8] ; ebx now contains 8
    cmp eax, ebx ; compares eax to ebx
    jge skip ; should not happen because eax is smaller than ebx
    call printdigit
skip:
    call printn
    call _exit

printdigit:
    mov eax, 0x30
    add [num], eax
    mov ecx, num
    mov edx, 1 ;length
    mov ebx, 1 ;write to stdout
    mov eax, 4 ;write call number
    int 0x80
    ret

printn:
    mov eax, 0x0A
    push eax
    mov eax, 4
    mov ebx, 1
    mov ecx, esp
    mov edx, 1
    int 0x80
    add esp, 4
    ret

_exit:
    mov eax, 1
    mov ebx, 0
    int 0x80


section .data
    num dw 5
    array dw 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Os comandos que estou usando para compilar o código

nasm -f elf Bubblesort.asm
ld -m elf_i386 -s -o Bubblesort Bubblesort.o
./Bubblesort

O que estou executando:

ubuntu 22.04.3 desktop amd64, (na máquina virtual, mas não deveria importar, eu acho)

A saída que eu quero deve ser

5

A saída real


Quero que printdigit seja chamado apenas quando num for menor do que o que está indexado no array

Tenho quase certeza de que não é um problema de computador, mas de código, mas não tenho certeza de onde

Agora fiz as seguintes alterações

_start:
   mov eax, [num]
   mov ebx, [array+8]
   cmp eax, ebx
   jae skip
section .data
    num dd 5
    array dd 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

o resto do código é normal

isso agora imprime o valor que desejo quando o array é indexado para um valor maior que num, mas quando não é maior, ainda imprime o valor

assembly
  • 1 1 respostas
  • 77 Views

1 respostas

  • Voted
  1. Best Answer
    Nassau
    2024-02-24T22:29:07+08:002024-02-24T22:29:07+08:00

    Solução:

    section .text
        global _start
    
    _start:
        mov eax, [num]
        movzx ebx, word [array+12]
        cmp eax, ebx
        jb skip
        call printdigit
        jmp exit
    skip:
        call printn
    exit:
        call _exit
    
    printdigit:
        mov eax, 0x30
        add [num], eax
        mov ecx, num
        mov edx, 1 ;length
        mov ebx, 1 ;write to stdout
        mov eax, 4 ;write call number
        int 0x80
        ret
    
    printn:
        mov eax, 0x0a
        push eax
        mov eax, 4
        mov ebx, 1
        mov ecx, esp
        mov edx, 1
        int 0x80
        add esp, 4
        ret
    
    _exit:
        mov eax, 1
        mov ebx, 0
        int 0x80
    
    
    section .data
        num dd 3
        array dw 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    

    mov eax, num

    eax = endereço de num, meu depurador mostra o valor 00402000.

    mov ebx, [array+8]

    ebx = 00050004.

    cmp eax,ebx

    eax >= ebx então o código vai para skipo rótulo.

    Escreva impressões de função 0x0Aque são new linecódigo. Se você mudar para 0x35Você verá 5.

    printdigito código nunca é executado.

    • 0

relate perguntas

  • x86 - mudando de 32 bits para 64 bits via RETF

  • Opcode não reconhecido em instruções de montagem de ponto flutuante para Xiao ESP32-C3 (baseado em RISC-V)

  • Como usar o GNU Assembler (GAS) para criar um arquivo ELF escrito à mão a partir do arquivo .s correspondente

  • Não consigo ler o registro LY do gameboy

  • Obtenha o valor do parâmetro no Assembly

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve