gpt4 book ai didi

c++ - MASM str 和 substr?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:14 27 4
gpt4 key购买 nike

我目前正在用 asm 编写一个 irc 机器人我已经在 C++ 中做过一次,所以我知道如何解决我遇到的大多数问题,但我需要一个 substr()[*] 函数,就像在 C++ 中看到的那样。我需要 substr 函数从 PING 请求中接收服务器名称,这样我就可以用相应的 PONG 响应进行响应

但是我不知道如何在MASM中实现它,我听说有一种叫做宏汇编的东西,似乎那些函数中经常使用substr

有谁知道如何让我的 substr 函数工作

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

这是我在 C++ 中使用 substr() 函数的方式:

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!
}

其中 data 是一个字符串,其中包含服务器发送给我的所有信息,而 SCHiMBot 是我用来与服务器对话的类这段代码是直接从我编写的机器人中 c&p 出来的,所以它应该是完美无缺的

最佳答案

这实际上并不像最初看起来那么容易回答。问题很简单:像 substr 这样的函数并不是真正孤立存在的——它是字符串库的一部分,要使它有用,您只需要至少勾勒出库作为一个整体组合在一起,你如何表示你的数据,等等。即,substr 创建一个字符串,但要这样做你需要决定什么是字符串

为了避免这个问题,我将忽略您实际提出的问题,并给出一个更适合汇编语言的更简单的答案。您真正需要的是从一个数据缓冲区开始,在该缓冲区中找到几个“标记”,然后将这些标记之间的内容复制到另一个缓冲区中的指定位置。首先,我们需要执行“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

关于c++ - MASM str 和 substr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com