在kdbg中测试汇编代码时,如何处理用户输入与输出?
在kdbg中调试汇编程序时处理stdin输入与stdout输出的正确方法
首先先看你给出的汇编宏代码:
; Read macro %macro read 2 mov rax, 0 mov rdi, 0 mov rsi, %1 mov rdx, %2 syscall %endmacro ; Write macro %macro write 2 mov rax, 1 mov rdi, 0 mov rsi, %1 mov rdx, %2 syscall %endmacro
先修正宏里的关键错误
你写的write宏有个明显问题:stdout的文件描述符是1,不是0,0是stdin的描述符。所以write宏里的mov rdi, 0必须改成mov rdi, 1,不然你是往stdin写数据,自然看不到任何输出。修正后的write宏应该是:
%macro write 2 mov rax, 1 mov rdi, 1 ; 这里改为1,指向标准输出stdout mov rsi, %1 mov rdx, %2 syscall %endmacro
kdbg中处理输入输出的正确操作
kdbg本身的输出窗口默认不会关联程序的stdin/stdout,所以你需要让程序在独立的终端窗口中运行,这样才能正常输入内容并看到输出:
调试前配置终端:
- 打开kdbg后,点击顶部菜单栏的
Settings->Configure KDBG。 - 在弹出的配置窗口中选择
Debugger标签页,找到Run program in terminal选项并勾选。 - 在下方的
Terminal emulator下拉框中选择你系统安装的终端(比如xterm、konsole或者你的默认桌面终端),保存设置即可。
- 打开kdbg后,点击顶部菜单栏的
调试时的操作步骤:
- 编译汇编程序时一定要加上调试信息,比如用nasm编译64位程序:
nasm -f elf64 your_program.asm -g -F dwarf,然后用ld链接:ld your_program.o -o your_program。 - 在kdbg中加载编译好的可执行文件,设置好断点后点击运行按钮。
- 这时候会弹出一个新的终端窗口,你的程序会在这个窗口里运行,你可以在这里输入内容,也能实时看到stdout的输出。
- 编译汇编程序时一定要加上调试信息,比如用nasm编译64位程序:
额外提示:解决输出缓冲问题
有时候stdout会有缓冲机制,如果输出的内容比较短(比如没有换行符),可能不会立刻显示。你可以在输出的字符串末尾加上换行符0xA(ASCII码的换行),因为换行通常会触发缓冲刷新。示例:section .data prompt db "Enter your input: ", 0xA ; 末尾加上换行符 prompt_len equ $ - prompt用修正后的write宏输出这个字符串,就能立刻看到提示内容了。
内容的提问来源于stack exchange,提问作者мајдејсаремех
相关产品推荐
相关产品推荐

