@magaaamed
Студент

Как передать значение переменной в стек (Ассемблер)?

Здравствуйте.
Решаю задачу на ассемблере TASM. Подпрограмма, которая вычисляет гиперболический синус. Эта подпрограмма должна быть связана с главной программой с использованием стандартов связи с языком С.
Моя проблема заключается в том, что я не могу загрузить вещественное число в стек.
Я ввожу число с клавиатуры, это число находиться в стеке FPU, засовываю ее в переменную Source, а потом я должен загрузить его в стек и вызвать подпрограмму, где я его выгружаю и начинаю вычисления
Вот примерный код:
---------------
Source dq ?
Result dq ?
---------------
sub sp,16
mov bp,sp
fstp Source
mov qword ptr [bp], Source //тут ошибка "need register in expression"
mov qword ptr [bp+8], Result //тут ошибка "need register in expression"
call OutFloat
Add sp,16
---------------
  • Вопрос задан
  • 1830 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Код может выглядеть как-то так:

void OutFloat(double v);

sub sp,16
mov bp,sp
fstp qword ptr [bp + 8]
call OutFloat
add sp,16


Т.е. можно выгружать значение из сопроцессора прямо в то место, где будет исходящий параметр для вызова функции.
Ошибка возникает из-за того, что нет команд mov пересылающих значение из памяти в память.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Muriam
с помощью команды push

push AX      ; передать значение регистра AX в стек
push ВX      ; передать значение регистра BX в стек

....               ; ваш код

pop BX       ; извлечь значение из стека в регистр AX
pop AX       ; извлечь значение из стека в регистр AX


Если вы отправляете несколько значений в стек и вынимаете их от туда, то нужно это делать по принципу LIFO (последний пришел, первый вышел)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы