2010-10-06 25 views
2

Je suis en train de coder un bot irc dans asm Je l'ai déjà fait une fois en C++, donc je sais comment résoudre la plupart des problèmes que je rencontre, mais j'ai besoin d'une fonction substr() [*] comme celle vue en C++ . J'ai besoin de la fonction substr pour recevoir le nom du serveur à partir d'une requête PING afin que je puisse répondre avec la réponse PONG correspondanteMASM str et substr?

Mais je ne sais pas comment l'implémenter en MASM, j'ai entendu parler de quelque chose appelé macroassembling, il semble que substr est souvent utilisé dans les fonctions

est-ce que quelqu'un a une idée comment je peux obtenir ma fonction substr pour travailler

[*] string substr (size_t pos = 0, size_t n = npos)

Voici comment j'utilise le funcion substr() en C++:

if(data.find("PING :") != std::string::npos){ 
string pong = "PONG :" + data.substr( (data.find_last_of(":")+1), (data.find_last_of("\r")-1) ); 
SCHiMBot.Pong(pong); // Keep the connection alive! 
} 

Lorsque les données est une chaîne contenant toutes les informations que le serveur me envoie, et SCHiMBot est une classe que j'utilise pour parler avec le serveur Ce code est c & p'ed directement d'un bot je Codé, il devrait donc être sans faille

Répondre

0
data.substr( (data.find_last_of(":")+1) 

Le premier paramètre de substr est la position de départ. Si c'est une valeur passée le dernier élément de la chaîne, l'exception out_of_range sera levée. Vous devriez vérifier que cela ne se produit pas.

if(data.find("PING :") != std::string::npos) 
{ 
    size_t s1 = data.find_last_of(":"); 
    size_t s2 = data.find_last_of("\r"); 

    if (s1 != string::npos && 
     s2 != string::npos && 
     s1+1 < data.size()) 
    { 
     string pong = "PONG :" + data.substr(s1+1, s2-1); 
     SCHiMBot.Pong(pong); // Keep the connection alive! 
    } 
} 
+0

Je pense que vous avez mal compris ma question, J'essaie de reproduire le même effet dans le code asm que dans ce qui se passe dans le C++ (Les données ne se termineront jamais au milieu de la chaîne PING: car il y a toujours des données qui suivent, mais je garderai le commentaire à l'esprit) – Rick

+0

J'ai relu votre question et j'ai vraiment mal compris votre problème. Désolé. Je pensais que cette version de C + que vous avez posté ne fonctionne pas. – Donotalo

1

Ce n'est vraiment pas aussi facile à répondre qu'il pourrait sembler au départ. Le problème est assez simple: une fonction comme substr n'existe pas vraiment isolément - elle fait partie d'une bibliothèque de chaînes de caractères, et pour la rendre utile, vous devez au moins esquisser comment la bibliothèque dans son ensemble s'emboîte, comment vous représentez vos données, etc. Par exemple, substr crée une chaîne, mais pour ce faire, vous devez décider quelle chaîne est. Pour éviter ce problème, je vais en quelque sorte ignorer ce que vous avez réellement demandé, et donner une réponse un peu plus simple qui convient mieux au langage d'assemblage. Ce dont vous avez vraiment besoin, c'est de commencer avec un tampon de données, de trouver quelques "marqueurs" dans ce tampon, et de copier ce qui se trouve entre ces marqueurs à une position désignée dans un autre tampon. Tout d'abord nous avons besoin du code pour faire le « find_last »:

; expects: 
; ESI = address of buffer 
; ECX = length of data in buffer 
; AH = character to find 
; returns: 
; ESI = position of item 
; 
find_last proc 
    mov al, [esi+ecx] 
    cmp ah, al 
    loopnz find_last 
    ret 
find_last endp 

Maintenant, pour copier la sous-chaîne dans la mémoire tampon de transmission, nous faisons quelque chose comme ceci:

CR = 13 

copy_substr proc 
    mov esi, offset read_buffer 
    mov ecx, bytes_read 
    mov ah, CR 
    call find_last ; find the carriage-return 
    mov edx, esi  ; save its position 

    mov esi, offset read_buffer 
    mov ecx, bytes_read 
    mov ah, ':' 
    call find_last ; find the colon 
    inc esi   ; point to character following colon 
    sub edx, esi  ; get distance from colon+1 to CR 
    mov ecx, edx 

    ; Now: ESI = address following ':' 
    ;  ECX = distance to CR 

    mov edi, (offset trans_buffer) + prefix_length 
    rep movsb   ; copy the data 
    ret 
copy_substr endp 
+0

Vous manquez quelques instructions 'ret'? – msandiford

+0

@spong: Plus maintenant! Merci de me le rappeler - cela fait évidemment un bout de temps que j'ai beaucoup codé en langage assembleur. –

+0

Merci, je vais voir si je peux obtenir ce travail (je suis nouveau à asm, et bien que je puisse utiliser fucntions et vérifier les erreurs, l'utilisation des registres est toujours difficile) – Rick