移动到缓冲区中的字符串结尾 - Assembly Languge

时间:2015-09-19 04:43:20

标签: string pointers assembly buffer eol

我正在尝试接受一个字符串,然后查看字符串中的最后一个值是否为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\

我是用户编程和编写i386机器的NASM。

1 个答案:

答案 0 :(得分:3)

将字符串的长度添加到缓冲区的地址,可以访问后面的字符串。

根据你的说法

  • 您想查看字符串中 中的最后一个值是否为EOL字符
  • 如果它是EOL(*)
  • ,你的目的是减少'rlen'

我得出结论,您考虑字符串中可能的EOL字符部分,其长度为 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