String 移动到缓冲区内字符串的末尾-汇编语言

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

我试图接收一个字符串,然后查看字符串中的最后一个值是否为EOL字符。我想我应该使用读入的字符串的长度,然后将其添加到缓冲区的地址中,以查找最后一个元素。这似乎不起作用

编辑:很抱歉,我没有提供更多信息。变量的定义如下:

  %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”
我认为你认为字符串中可能的EOL字符部分是由长度RRIN定义的。如果你不这样做,那么(*)就没有意义了

使用
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。我不会对那些可能不熟悉汇编语言的人做出这样的假设。这是正确的答案,对我来说非常有效或者我的应用程序。谢谢你的帮助。我还找到了一个替代的、更长的解决方案,我将发布。我已经对这个答案进行了投票,因为它现在与给定的更新问题相匹配。