2017-02-03 2 views
2

Я попытался передать несколько параметров, как этот код, чтобы вычислить (AB)^3:Как вернуть несколько значений в MASM

diffcube:push bp 
     mov bp,sp 
     mov ax,[bp+4] 
     sub ax,[bp+6] 
     mov bp,ax 
     mul bp 
     mul bp 
     pop bp 
     ret 4 

Легко передать параметры с помощью стека, но как я могу вернуться несколько значений в процедуре в MASM? (Очевидно, что число регистров всегда ограничено.)

ответ

1

Там нет стандартного соглашения о вызове, который поддерживает возврат нескольких значений, так как не существует никакого способа сделать это в C.

В C, вы определения структуры (или, более общо, определенный пользователем тип) , выделить память для экземпляра этого типа, инициализировать его поля и вернуть указатель на него. (В качестве альтернативы, вы можете назначить вызывающей стороне память для структуры и передать указатель на нее.) Вы можете сделать то же самое на языке ассемблера.

Или вы можете определить пользовательское соглашение о вызове, а затем вернуть значения, как вам нравится. Например, вы можете вернуть их в определенные, определенные регистры по своему усмотрению. Или, вы могли бы заставить вызывающего абонента выделить необходимое количество места в стеке, а затем сохранить значения в этих слотах.

Пока вызывающая сторона вашей функции не знает и не придерживается своего соглашения о вызове, у вас нет проблемы. При написании полностью на ассемблере вы можете сделать это легко, но у вас возникнут проблемы, если вы попытаетесь связать этот код с C или любым другим языком.

+0

Обратите внимание, что нет режима адресации формы '[sp + 4]'. Вы уверены, что знаете сборку 8086? – fuz

+1

@fuz Это прощающая ошибка, x86 полон исторических, не-смысловых, артефактов. Я не думаю, что этого достаточно, чтобы рассказать о знании Коди ... –

+0

Ух, совсем не уверен. Я пишу 32-битный ассемблерный код. Сожалею. –

2

в классических соглашений о вызовах Cdecl и STDCALL можно возвращать только одно значение, насколько я обеспокоен. Это значение возвращается в al, ax, или dx:ax в зависимости от его размера.

Однако, вы можете сделать свое собственное соглашение о вызове, чтобы вернуть больше значений. Например, вызывающее соглашение, используемое Go, возвращает дополнительные значения в стеке, переписывая (?) Аргументы. Если требуется вернуть больше значений, дополнительное пространство должно быть выделено вызывающим абонентом перед вызовом функции.

+0

Почему классические условные обозначения предпочитают возвращать только одно значение? Выделение необходимого пространства в стеке, возвращающее несколько значений, возможно и удобно. – Kon

+0

@Kon Не уверен. Несколько языков программирования позволяют возвращать более одного значения. В математике это тоже необычно. – fuz

+0

Вот что меня смущает. Мне интересно, почему язык программирования просто возвращает одно значение с самого начала, например C. – Kon

Смежные вопросы