Передача данных в ассемблер. Объясните как работает - Assembler
Формулировка задачи:
Здравствуйте.
Нужно реализовать метод ньютона с подвижным полюсом с вычислением на ассемблере.
мои достижения:
на C++:
И часть процедуры(алгоритм я вырезал, он не нужен) на ассемблере, с которой как раз проблемы:
с float почему-то все было просто, а здесь... помогите разобраться:
каким образом значения хранятся в стеке и как их правильно считывать оттуда?
или хотя бы в какую сторону копать, чтобы понять как решить проблему.
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
Решение задачи: «Передача данных в ассемблер. Объясните как работает»
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, который, вероятно, занимается передачей данных. Вот возможное объяснение того, что происходит в этом коде:
push addsITER;
- Эта инструкцияpush
добавляет 32-битный адрес переменнойaddsITER
в стек.push addsRES;
- Эта инструкцияpush
добавляет 32-битный адрес переменнойaddsRES
в стек.push addsBEG;
- Эта инструкцияpush
добавляет 32-битный адрес переменнойaddsBEG
в стек.push rightINT+4;
- Эта инструкцияpush
добавляет старшие 32 бита переменнойrightINT
(которая, вероятно, содержит результат предыдущей операции) в стек.push rightINT;
- Эта инструкцияpush
добавляет младшие 32 бита переменнойrightINT
в стек.push leftINT+4;
- Эта инструкцияpush
добавляет старшие 32 бита переменнойleftINT
в стек.push leftINT;
- Эта инструкцияpush
добавляет младшие 32 бита переменнойleftINT
в стек.push eps+4;
- Эта инструкцияpush
добавляет старшие 32 бита переменнойeps
в стек.push eps;
- Эта инструкцияpush
добавляет младшие 32 бита переменнойeps
в стек.call get_str_length
- Эта инструкцияcall
вызывает функцию с именемget_str_length
. Эта функция, вероятно, используется для определения длины строки. Пожалуйста, обратите внимание, что это всего лишь предположение о том, что происходит в этом коде. Без дополнительной информации о контексте и назначении этих переменных, это объяснение может быть неполным или неточным.