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

Move to end of string within buffer - Assembly Languge

我正在尝试输入一个字符串,然后查看该字符串中的最后一个值是否为 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 机器编译和编写。

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

根据你的说法

  • 您想查看 字符串中的最后一个值是否是 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

这是到达字符串末尾的更迂回的方式(字面意思)。我根据计数器 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