2010-05-23 4 views
4

que je peux faire quelque chose comme ça sur l'Assemblée bne jsr swap, sinon comment puis-je résoudre ce problème de C, merci à l'avancesous-programmes sur l'Assemblée

if(start!=pivot_index){ 
    swap(board,start,pivot_index); 
} 

on m'a appris que je dois écrire jsr et sub-routine mais puis-je faire quelque chose comme ça bne sub-routine

+0

Quelle architecture? –

+0

pdp-11 mais je travaille sur windows, j'ai un simulateur – lego69

Répondre

4

Dans l'ensemble qui serait habituellement traduit en quelque chose comme ceci (pseudo-assemblage) :

load [start] 
compare [pivot_index] 
branch-if-equal label1 
push [pivot_index] 
push [start] 
push [board] 
call swap 
add-stack-pointer 12 
label1: 

ie. l'instruction if est convertie en un saut qui saute par-dessus le corps du if si l'expression de contrôle n'est pas vraie.

2

Bien sûr, vous pouvez le faire. Sur x86, vous avez besoin de deux branches:

# assume EAX = start, EBX = pivot_index 

    cmp eax, ebx 
    beq .SkipSwap 

    call swap 

.SkipSwap: 

Pour le montage ARM, il est plus facile parce que vous pouvez utiliser une branche conditionnelle:

# assume r0 = start, r1 = pivot_index 

    cmp r0, r1 
    blne swap 
+0

désolé, mais je travaille sur un simulateur pdp-11, puis-je faire la même chose? – lego69

+0

bien. Pour PDP11, prenez le code x86, ajustez les noms des registres et utilisez jsr à la place de l'appel pour sauter .. Devrait fonctionner. –

0

Non, vous ne pouvez pas faire bne subroutine au lieu de jsr subroutine, car jsr signifie «retour de saut». La différence entre cela et les instructions de branchement conditionnel est que le jsr pousse l'adresse de retour sur la pile, de sorte que le sous-programme sait où retourner. Si vous vous connectez au sous-programme en utilisant bne, il n'y a pas d'adresse de retour sauvegardée, donc le sous-programme ne sait pas où retourner quand vous avez terminé.

La réponse de caf vous montre la façon typique de gérer cela, il suffit de la traduire en opérations PDP-11.