Nano Hash - криптовалюты, майнинг, программирование

Функция MASM не возвращает правильное значение

Мне нужно вызвать функцию, которая складывает три целых числа из ассемблерного кода; Сами целые числа задаются в сборочной части;

Все выглядит правильно, но функция masm, похоже, не возвращает правильное значение. Оно хранится в eax и должно быть возвращено как значение функции, но при запуске кода C он ничего не печатает, а требуемое значение (в данном случае 15) на самом деле является кодом выхода программы. Итак, есть ли способ распечатать этот результат?

МАСМ-код:

.586
.MODEL FLAT, C
.DATA
a1 DWORD 6
a2 DWORD 5
a3 DWORD 4
.CODE

func_asm PROC C

push a3
push a2
push a1

EXTRN numbers: proc
call numbers 
leave
ret
func_asm ENDP 
END

C-код:

#include <stdio.h>

extern int __cdecl func_asm();
int numbers(int, int, int);

int main()
{
    printf("%d", func_asm());
}
int numbers(int a1, int a2, int a3)
{
    return a1 + a2 + a3;
}
14.12.2019

Ответы:


1

Хорошо, получается, что перед возвратом значения нужно запушить eax. А перед этим нам нужно создать сам стек, поэтому окончательный код будет таким:

.586
.MODEL FLAT, C
.STACK
.DATA
 a1 DWORD 6
 a2 DWORD 5
 a3 DWORD 4
.CODE
func_asm PROC C

push ebp
mov ebp, esp

push a3
push a2
push a1

EXTRN numbers: proc

call numbers 
push eax
leave
ret
func_asm ENDP

END

Код C остается неизменным

14.12.2019
  • Нет, вам не нужно push eax. Вам необходимо настроить EBP в качестве указателя кадра для работы leave: это компактная версия mov esp,ebp ; pop ebp. Это была твоя единственная проблема; Делать дополнительный толчок перед отпуском всегда бессмысленно. 14.12.2019
  • О, это имеет смысл. Большое спасибо 15.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..