@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
---------------
  • Вопрос задан
  • 671 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Код может выглядеть как-то так:

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 (последний пришел, первый вышел)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы