我得到了一个函数描述:接受缓冲区地址和大小作为参数.从标准输入中读取下一个单词(跳过空格进入缓冲区).如果单词太大,则停止并返回0
指定的缓冲区;否则返回缓冲区地址.此函数应对接受的字符串进行空终止.但当我try 输入echo -n "" | ./read_word
或echo -n "\t " | ./read_word
之类的内容时,我编写的代码不起作用.输出为
[3] 40467 done echo -n "\t " |
40468 segmentation fault (core dumped) ./read_word
我的代码中可能有什么错误?
它是这样的:
read_word:
xor r8, r8
xor r9, r9
mov r9, rdi
push rdi
push rsi
.whitespace_reader:
call read_char
mov rdi, rax
push rax
call .whitespace_checker
cmp rax, 2
jz .fail
cmp rax, 0
pop rax
jz .whitespace_reader
pop rsi
pop rdi
.word_reader:
inc r8
cmp r8, rsi
jnb .fail ; если >=, фейлим, иначе пишем в буфер
mov byte [rdi], al
inc rdi
push rdi
push rsi
call read_char
pop rsi
pop rdi
push rdi
mov rdi, rax
push rax
call .whitespace_checker
cmp rax, 0
pop rax
pop rdi
jz .success
jmp .word_reader
; возвращает 0, если символ пробельный, 1 если непробельный и 2, если нуль-терминатор
.whitespace_checker:
mov rax, rdi
cmp rax, 0x20
jz .ret_0
cmp rax, 0x9
jz .ret_0
cmp rax, 0xA
jz .ret_0
cmp rax, 0
jz .ret_2
mov rax, 1
ret
.ret_0:
mov rax, 0
ret
.ret_2:
mov rax, 2
ret
.fail:
xor rax, rax
ret
.success:
inc rdi
mov byte [rdi], 0
mov rax, r9
mov rdx, r8
ret`