Como me pediram a resolução da questão, aqui vai:
Primeiro, eu tentei escrever o código assembly de uma forma um pouco mais amigavel, algo como um pseudo-código:
Função F(16bits *a, 16bits b):
EBX = a
ECX = (Completa com ZERO) b
if (b < 0)
return
EDX = (Completa com ZERO) *a
EAX = 0
while (CX > AX)
EDX = EDX - 1
EAX = EAX + 2
*a = DX
return
Main:
EBP = ESP
ESP = ESP - 24
[EBP - 2] = 24
[ESP + 4] = 100
EAX = EBP - 2
[ESP] = EAX
Call F
return [EBP - 2]
Com essa estrutura, podemos ver que a Main está preperando valores para passar para a função, no caso, como os valores que entram de parametrô para a função são os 2 ao topo da pilha, foi reservado um espaço na memória, aonde se armazenou o valor inteiro 24, depois criou-se uma referência ao endereço aonde ele foi guardado, e essa referência foi empilhada, de forma a ser passada como argumento da função, por isso fica claro que o primeiro argumento é um ponteiro. O segundo argumento é só um valor inteiro, no caso o inteiro 100. Vemos também que é retornado o valor que foi usado pelo ponteiro.
OBS: não confunda o que eu estou chamando de inteiro acima, com o tipo de váriavel int.
No caso da função, acho que mesmo dessa forma, ainda fica um tanto confusa a sua função, então vamos tentar colocar em C, para avaliar corretamente:
void f(short *a, short b)
{
short temp;
if (b < 0)
return;
temp = 0;
while (b > temp)
{
*a = *a - 1;
temp = temp + 2;
}
return;
}
int main(void)
{
short *x, y;
*x = 24;
y = 100;
f(x, y);
return *x
}
Bem, com o código anterior, deduzir o código C é uma tarefa mais fácil, e com o código C, dá para ver claramente o que o algoritmo faz.
Para fazer a letra b, basta rodar o algoritmo, a parte mais importante é o loop:
1) temp = 0 / *a = 24 / b = 100
2) temp = 2 / *a = 23 / b = 100
3) temp = 4 / *a = 22 / b = 100
4) temp = 6 / *a = 21 / b = 100
5) temp = 8 / *a = 20 / b = 100
6) temp = 10 / *a = 19 / b = 100
7) temp = 12 / *a = 18 / b = 100
8) temp = 14 / *a = 17 / b = 100
9) temp = 16 / *a = 16 / b = 100
10) temp = 18 / *a = 15 / b = 100
11) temp = 20 / *a = 14 / b = 100
...
temp = 100 / *a = -26 / b = 100
O valor que a main retorna é -26