繁体   English   中英

64位NASM文件处理问题

[英]64bit NASM file handling problems

我设法在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
section .data
    filename db 'AVG.asm'


section .bss
    buffer resb 2000
    fd_in resb 1

section .text
    global _start
_start:
        mov rax,2
        mov rdi,filename
        mov rsi,0
        mov rdx,0777
        syscall

        mov [fd_in],rax

        mov rax,0
        mov rdi,[fd_in]     
        mov rsi,buffer
        mov rdx,2000
        syscall


        mov rax,1
        mov rdi,1
        mov rsi,buffer
        mov rdx,2000
        syscall



        mov rax,3
        mov rdi,[fd_in]
        syscall

        mov rax,60
        mov rdi,0
        syscall

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM