Код сборки x86 выполняется успешно, но vscode показывает ошибку без дополнительной информации.

Я новичок в сборке, и у меня возникла проблема. Я скомпилировал следующий код с помощью GCC:

      .intel_syntax noprefix

.section .data
number:
    .int 65

message:
    .ascii "The number is %d %d.\n\0"

.section .text
    .globl  _main

_main:
    push ebp

    lea eax, [message]
    mov ebx, number
    mov [esp + 8], ebx
    add ebx, 1
    mov [esp + 4], ebx
    mov [esp], eax

    call _printf

    pop ebp
    xor eax, eax
    ret

Он может отображать сообщениеThe number is 66 65.на консоли, но vscode показывает некоторые ошибки без дополнительной информации.

вывод vscode

Я попытался удалить строкуmov [esp + 4], ebx, и ошибка, которую показал vscode, исправлена.

      .intel_syntax noprefix

.section .data
number:
    .int 65

message:
    .ascii "The number is %d %d.\n\0"

.section .text
    .globl  _main

_main:
    push ebp

    lea eax, [message]
    mov ebx, number
    mov [esp + 8], ebx
    add ebx, 1
    mov [esp], eax

    call _printf

    pop ebp
    xor eax, eax
    ret

Вывод vscode после исправления

Может ли кто-нибудь помочь мне решить проблему и объяснить ее? Спасибо!

1 ответ

Спасибо за мистера/мисс. Ответ Питера (а также спасибо за ответ г-на/г-жи rpatel3001): я решаю эту проблему, резервируя место в стеке.

Вот код после изменения:

      .intel_syntax noprefix

.section .data
number:
    .int 65

message:
    .ascii "The number is %d %d.\n\0"

.section .text
    .globl  _main

_main:
    push ebp
    sub esp, 8 # <-----

    lea eax, [message]
    mov ebx, number
    mov [esp + 8], ebx
    add ebx, 1
    mov [esp + 4], ebx
    mov [esp], eax

    call _printf

    add esp, 8 # <-----

    pop ebp
    xor eax, eax
    ret

Другие вопросы по тегам