2010-10-06 1 views
2

Я в настоящее время кодирую irc bot в asm Я уже делал это один раз на C++, поэтому я знаю, как решить большинство проблем, с которыми я сталкиваюсь, но мне нужна функция substr() [*], подобная той, что видна в C++ , Мне нужна функция substr для получения имени сервера из запроса PING, поэтому я могу ответить с соответствующим ответом PONGMASM str и substr?

Но я не знаю, как имплантировать его в MASM, я слышал о чем-то, называемом macroassembling, кажется, что substr часто используется в тех функциях

кто-нибудь есть идеи, как я могу получить мои функции зиЬзЬг работать

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

Это, как я использую зиЬзЬг() несильно в 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! 
} 

Где данные строка удерживать всю информацию сервер посылает меня, и SCHiMBot класса я использую, чтобы поговорить с сервером Этот код с & p'ed прямо из бота я кодированный, поэтому он должен быть безупречным

ответ

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

Первый параметр substr является исходным положением. Если это значение передается последним элементом строки, будет выбрано исключение out_of_range. Вы должны убедиться, что этого не происходит.

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

Я думаю, вы поняли мой вопрос, Я пытаюсь воспроизвести тот же эффект в коде asm, что и в C++ (данные никогда не будут заканчиваться в середине строки PING: поскольку всегда есть данные, но я буду держать комментарий в виду) – Rick

+0

Я перечитал ваш вопрос, и я действительно неправильно понял вашу проблему. простите за это. Я думал, что эта версия C +, которую вы опубликовали, не работает. – Donotalo

1

Это действительно не так легко ответить, изначально это может показаться. Проблема довольно проста: такая функция, как substr, действительно не существует изолированно - она ​​является частью строковой библиотеки и, чтобы сделать ее полезной, вам нужно как минимум набросать, как библиотека в целом подходит друг к другу, как вы представляете свои данные и т. д. Т.е., substr создает строку, но для этого вам нужно решить, что строка is.

Чтобы избежать этой проблемы, я собираюсь игнорировать то, что вы на самом деле просили, и дать несколько более простой ответ, который больше подходит для ассемблера. Вам действительно нужно начать с одного буфера данных, найти пару «маркеров» в этом буфере и скопировать то, что находится между этими маркерами, в назначенную позицию в другом буфере. Сначала нам нужно код, чтобы сделать «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 

Теперь, чтобы скопировать подстроку в буфер передачи, мы делаем что-то вроде этого:

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

Вы не нашли пару инструкций 'ret'? – msandiford

+0

@spong: Больше нет! Спасибо, что напомнили мне, что, очевидно, прошло некоторое время, так как я много кодировал на ассемблере. –

+0

Спасибо, я посмотрю, смогу ли я заставить это работать (я новичок в asm, и хотя я могу использовать fucntions и проверять наличие ошибок, использование регистров по-прежнему сложно) – Rick