Передача данных в ассемблер. Объясните как работает - 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. Эта функция, вероятно, используется для определения длины строки. Пожалуйста, обратите внимание, что это всего лишь предположение о том, что происходит в этом коде. Без дополнительной информации о контексте и назначении этих переменных, это объяснение может быть неполным или неточным.