gpt4 book ai didi

linux - 64 位 NASM 文件处理问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:17:19 25 4
gpt4 key购买 nike

我设法在我的 64 位 Linux 系统上编写了一个 NASM 程序,它从输入中删除非字母符号并在单独的行中打印每个单词。问题是我得到 RCX = -1 我必须得到读取的字符数,结果我得到了段错误。我已经花了几个小时试图弄清楚如何修复这个错误。希望你们能帮助我。提前致谢。

这是我的代码:

section .data

file1 db "data", 0
file2 db "results", 0

text times 255 db 0
textSize equ $ - text
buff times 255 db 0
buffSize equ $ - buff


section .text
global main
main:
mov rax, 2
mov rdi, file1
mov rsi, 0 ;read only
mov rdx, 0x7777
syscall ;open file1
mov rbx, rax ;save fd to rbx
mov rsi, text ; a pointer to the current character

mov rax, 0
mov rdi, rbx ;fd of file1
mov rsi, text
mov rdx, textSize
syscall ;read the text from file1

mov rax, 3
mov rdi, rbx
syscall ;close file1

mov rcx, rax ; rcx - character counter

mov rbx, buff ;rbx will be our buffer

cmp rcx, 0
je exit ; if nothing to read - exit

process_loop1:
mov dl, byte[rsi]

cmp byte[rsi], 0x41 ; "A"
jl inc1
cmp byte[rsi], 0x5a ; "Z"
jle save
cmp byte[rsi], 0x61 ; "a"
jl inc1
cmp byte[rsi], 0x7a ; "z"
jle save
jmp inc1 ;check text

inc1:
inc rsi
dec rcx
jnz process_loop1
jmp print

save:
mov byte [ebx], dl
jmp inc2 ;save letters


inc2:
inc rsi
inc rbx
dec rcx
jnz process_loop2
jmp print



process_loop2:
mov dl, byte[rsi]

cmp byte[rsi], 0x41 ; "A"
jl enter
cmp byte[rsi], 0x5a ; "Z"
jle save
cmp byte[rsi], 0x61 ; "a"
jl enter
cmp byte[rsi], 0x7a ; "z"
jle save
jmp enter



enter:
mov byte [ebx], 10 ;enter
inc rsi
inc rbx
dec rcx
jnz process_loop1
jmp print

print:
mov rax, 2
mov rdi, file2
mov rsi, 1 ;write only
mov rdx, 0x7777
syscall ;open file2
mov rbx, rax ;save fd to rbx


mov rax, 1
mov rdi, rbx
mov rsi, buff
mov rdx, buffSize
syscall ;print result

mov rax, 3
mov rdi, rbx
syscall ;close file2
jmp exit

exit:
mov rax, 60
mov rdi, 0
syscall

最佳答案

sys_read 和您尝试检查接收到的字节数之间有一个 sys_close。因此,您正在检查关闭的返回值,而不是读取的返回值。另请注意,rcx 已被系统调用破坏,因此您不能仅向上移动 mov rcx, rax 行。

此外,在一些地方您使用 [ebx] 而不是 [rbx]。

此外,您可能希望对结果文件使用 O_CREAT 并且只写入您已处理的字节数,而不是 buffSize

关于linux - 64 位 NASM 文件处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com