Invertion d'une chaine de caractère.

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 5 déc. 2006 à 18:43
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 6 déc. 2006 à 03:33
Bonjour,

Voila je débute en ASM et je veu faire un bête programme qui inverse une chaine de caractère. Je l'ai fait, mais celui-ci, ne va pas vraiment très bien. Je l'ai tester sur papier, tout doit aller, je l'ai filer à un gars, il n'a rien trouver non plus :s . Voici le code :

.386
assume SS:pile,CS:code,DS:donnees

pile segment stack use16
    DB 1024 DUP(0)
pile ends

donnees segment use16
   acStr1 DB "zorro$"
donnees ends

code segment use16
main :

    mov AX,donnees
    mov DS,AX

   mov SI,0
   mov BX,5
   dec BX
   mov AX,0

   deb_bcl_1 :
             CMP SI,BX
             JE fin_bcl_1 ;Si les deux compteurs sont égaux, on arrête la boucle.

             mov AL,acStr1[SI]
             
             Xchg AL,acStr1[BX]
             
             mov acStr1[SI],AL

             inc SI
             dec BX
   fin_bcl_1:

   mov AH,09h
   LEA DX,acStr1
   int 21h

    mov ah,4ch
    int 21h
code ends
end main

Au lieu d'afficher orroz il affiche oorrz, il ne fait pas une fois assez l'invertion, mais j'ignore pourquoi , j'ai esseye de remplacer le Je pas JA ou JAE, mais rien n'y fait.

Merci d'avance.
++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]

2 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 déc. 2006 à 22:37
salut,

et ça, ça donne quoi ?

...
mov SI,0
mov DI,5
dec DI
mov AX,0
lea BX,acStr1

   deb_bcl_1 :
             CMP SI,DI
             JAE fin_bcl_1 ;above obligatoire si le mot est de taille paire.

             mov AL,[BX+SI]
             
             Xchg AL,[BX+DI]
             
             mov [BX+SI],AL

             inc SI
             dec DI
   fin_bcl_1:

...
@++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 déc. 2006 à 03:33
xchg est à bannir, bouffeur de cycles issu du temps du mono pilpeline qui se remplace aisément par 2 mov qui seront eux parallelisables.


SI et DI me semblent aussi inutiles, voir nuisibles ici car l'adressage indexé est couteux en taille de code, autant s'en passer quand on peut.


lea AX, acStr1
mov BX, AX
add AX, 5


deb_bcl_1 :
cmp  BX, AX
jae short fin_bcl_1
mov  dl, [AX]
mov  cl, [BX]
mov  [AX], cl
mov  [BX], dl
dec  AX
inc BX
jmp  short deb_bcl_1
fin_bcl_1:

ciao...
BruNews, MVP VC++
0
Rejoignez-nous