Передача данных в ассемблер. Объясните как работает - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Нужно реализовать метод ньютона с подвижным полюсом с вычислением на ассемблере. мои достижения: на C++:
extern "C" void __stdcall get_str_length(double EPS, double leftINT, double rightINT, double *addsBEG, double *addsRES, int *addsITER);
 
void main() {
 
    double a,b;
    double eps;
 
    double result;
    double x0;
    int iteration;
 
    a = 2;
    b = 6;
    x0 = 4;
    eps =0.0001;
    iteration= 0.0;
    result=0.0;
 
    get_str_length(eps, a, b, &x0, &result, &iteration);
 
}
И часть процедуры(алгоритм я вырезал, он не нужен) на ассемблере, с которой как раз проблемы:
.386
.MODEL FLAT
.data
    alpha dq 1.0
    betta dq 1.0
.CODE
        
_get_str_length@36 PROC
;-----------------------
    finit
 
    fld qword ptr [esp+4]; пишется 0
    fld qword ptr [esp]; пишется eps
    fld qword ptr [esp+8]; и дальше пишется мусор..
    fld qword ptr [esp+16]
        ...
 
_get_str_length@36 ENDP
END
с float почему-то все было просто, а здесь... помогите разобраться: каким образом значения хранятся в стеке и как их правильно считывать оттуда? или хотя бы в какую сторону копать, чтобы понять как решить проблему.

Решение задачи: «Передача данных в ассемблер. Объясните как работает»

textual
Листинг программы
push addsITER; 32-разряда адреса
push addsRES; 32-разряда адреса
push addsBEG; 32-разряда адреса
push rightINT+4; старшие 32 разряда
push rightINT; младшие 32 разряда
push leftINT+4; старшие 32 разряда
push leftINT; младшие 32 разряда
push eps+4; старшие 32 разряда
push eps; младшие 32 разряда
call get_str_length

Объяснение кода листинга программы

Код, который вы предоставили, является фрагментом программы на языке Assembler, который, вероятно, занимается передачей данных. Вот возможное объяснение того, что происходит в этом коде:

  1. push addsITER; - Эта инструкция push добавляет 32-битный адрес переменной addsITER в стек.
  2. push addsRES; - Эта инструкция push добавляет 32-битный адрес переменной addsRES в стек.
  3. push addsBEG; - Эта инструкция push добавляет 32-битный адрес переменной addsBEG в стек.
  4. push rightINT+4; - Эта инструкция push добавляет старшие 32 бита переменной rightINT (которая, вероятно, содержит результат предыдущей операции) в стек.
  5. push rightINT; - Эта инструкция push добавляет младшие 32 бита переменной rightINT в стек.
  6. push leftINT+4; - Эта инструкция push добавляет старшие 32 бита переменной leftINT в стек.
  7. push leftINT; - Эта инструкция push добавляет младшие 32 бита переменной leftINT в стек.
  8. push eps+4; - Эта инструкция push добавляет старшие 32 бита переменной eps в стек.
  9. push eps; - Эта инструкция push добавляет младшие 32 бита переменной eps в стек.
  10. call get_str_length - Эта инструкция call вызывает функцию с именем get_str_length. Эта функция, вероятно, используется для определения длины строки. Пожалуйста, обратите внимание, что это всего лишь предположение о том, что происходит в этом коде. Без дополнительной информации о контексте и назначении этих переменных, это объяснение может быть неполным или неточным.

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы