移动到缓冲区内字符串的末尾 - 汇编语言
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
我正在尝试输入一个字符串,然后查看该字符串中的最后一个值是否为 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