【发布时间】:2013-11-29 03:46:16
【问题描述】:
我设法在我的 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
【问题讨论】:
-
为什么要使用“幻数”?如果您使用
mov rax, sys_open而不是mov rax, 2,它不会让您的代码自我记录吗 -
你在哪一行得到分段错误?您是否尝试在调试器中运行您的程序? (汇编程序员不应该需要手持......)
-
我用 gdb 测试了程序,发现在 sys_read 调用之后 rax 保持值 -1 而不是读取的符号数。我怎样才能得到符号的数量?
-
这可能暗示
sys_read或sys_open(或两者)失败。 -
当我进一步测试编程时,我设法弄清楚 sys_read 和 sys_open 工作,当我检查数据文件中的字母是否不为空时,程序确实读取了文件并打印了结果计算读取的符号数量,它只是不会终止,直到它溢出,整个缓冲区大小为 255 位,填充 '00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\...'
标签: linux assembly linux-kernel x86-64 nasm