String 移动到缓冲区内字符串的末尾-汇编语言
我试图接收一个字符串,然后查看字符串中的最后一个值是否为EOL字符。我想我应该使用读入的字符串的长度,然后将其添加到缓冲区的地址中,以查找最后一个元素。这似乎不起作用 编辑:很抱歉,我没有提供更多信息。变量的定义如下:String 移动到缓冲区内字符串的末尾-汇编语言,string,pointers,assembly,buffer,eol,String,Pointers,Assembly,Buffer,Eol,我试图接收一个字符串,然后查看字符串中的最后一个值是否为EOL字符。我想我应该使用读入的字符串的长度,然后将其添加到缓冲区的地址中,以查找最后一个元素。这似乎不起作用 编辑:很抱歉,我没有提供更多信息。变量的定义如下: %define BUFLEN 256 SECTION .bss ; uninitialized data section buf: resb BUFLEN ; buffer fo
%define BUFLEN 256
SECTION .bss ; uninitialized data section
buf: resb BUFLEN ; buffer for read
newstr: resb BUFLEN ; converted string
rlen: resb 4
然后调用dos中断以接受来自用户的字符串,如下所示:
; read user input
;
mov eax, SYSCALL_READ ; read function
mov ebx, STDIN ; Arg 1: file descriptor
mov ecx, buf ; Arg 2: address of buffer
mov edx, BUFLEN ; Arg 3: buffer length
int 080h
然后我们进入我们的循环:
test_endl:
mov ecx, [rlen]
mov esi, buf
add esi, ecx ; i want to move 'rlen' bytes into buf
mov al, [esi] ; to see what the last element is
cmp al, 10 ; compare it to EOL
jnz L1_init
dec ecx ; and then decrease 'rlen' if it is an EOL
mov [rlen], ecx\
我是用户NASM,为i386机器编译和编写。将字符串的长度添加到缓冲区的地址,可以访问字符串后面的字节 基于你这么说
- 要查看字符串中的最后一个值是否为下线字符
- 如果是下线(*),您的目标是减少“rlen”
mov al[esi-1]
查看最后一个元素是什么
test_endl:
mov ecx, [rlen]
mov esi, buf
add esi, ecx ; i want to move 'rlen' bytes into buf
mov al, [esi-1] ; to see what the last element is
cmp al, 10 ; compare it to EOL
jnz L1_init
dec ecx ; and then decrease 'rlen' if it is an EOL
mov [rlen], ecx
这是一种更迂回的方式(字面上)到达字符串的末尾。我根据计数器rlen的大小遍历字符串中的所有字符。然后,一旦循环完成,我会根据需要进行比较并减少rlen
test_loop:
mov al, [esi] ; get a character
inc esi ; update source pointer
dec ecx ; update char count
jnz test_loop ; loop to top if more chars
cmp al, 10 ; comparison
jne L1_init ; if not EOL jump to L1_init
mov ecx, [rlen] ; decrease the size of rlen if necessary
dec ecx
mov [rlen], ecx
我假设您使用的是
nasm
?你的问题没有明确说明。但是,如果您在问题中包括代码中定义rlen
和buf
的部分,则会有所帮助。我敢打赌,你对rlen
的定义中存在一个问题,他包括了一个最小的例子,投票结束这个问题是一个糟糕的决定@彼得,在这种情况下,我认为你错了。海报实际上已经修改了他原来的问题(我现在才知道)。当我写关闭OP时,没有定义变量声明,因此它不完整。变量的大小(最初未知)可能会对mov ecx[rlen]产生问题
。既然OP实际上修改了他的问题,我愿意收回最后一票。请查看编辑历史记录,一整天后您就会看到它完成了。您是否也考虑过在没有进一步信息的情况下,rlen
也可以定义为字节或单词,并且您在回答中考虑了这一点问题是,如果没有更多的信息,你的建议可能并不全是错的。我们必须相信OP。如果他/她写mov ecx,[rlen]
我相信他/她知道这是一个dword。你会惊讶地发现我在电视上看到了多少次,以至于这个问题最终成为一个大问题。事实是,这是一个措辞拙劣的问题,因为它不是MCVE。我不会对那些可能不熟悉汇编语言的人做出这样的假设。这是正确的答案,对我来说非常有效或者我的应用程序。谢谢你的帮助。我还找到了一个替代的、更长的解决方案,我将发布。我已经对这个答案进行了投票,因为它现在与给定的更新问题相匹配。