linux - Kdbg 中显示的值是错误的 -- NASM

标签 linux assembly nasm kdbg

如何测试 k 的值是否正确?

section .data
    k dw 5
    m dw 110
    rez dw 0 
section .bss
    tabela resq 3 
section .text
global _start
extern uslov
_start:
    mov qword [tabela], k
    mov qword [tabela + 8], m
    mov qword [tabela + 16], rez

    mov rbx, tabela
    call uslov
mov rax, 60
mov rdi, 0
syscall

当我尝试检查 kdbg 中 k,m,rez 的值时,m 和 rez 的值都很好,但 k 的值完全不同,现在一开始我以为是随机的,但它似乎很难将 rez 的值读取为 8 字节的数字而不是 2 字节的数字,并且还读取了 6 个字节,从 m 和 rez 中获取所有设置 1,这是错误的,所以我如何显示正确吗?

截图: enter image description here

最佳答案

当我使用此命令行编译时,我可以使用您的源代码重现此内容(删除对 uslov 的 undefined reference ):

nasm -f elf64 test.asm -o test.o
ld test.o -o test

然后,在 GDB 中我确实可以看到 k 似乎有 sizeof(k)==4:

gdb ./test -ex 'tb _start' -ex r -ex 'p sizeof(k)'
Reading symbols from ./test...done.
Starting program: /tmp/test

Temporary breakpoint 1, 0x00000000004000b0 in _start ()
$1 = 4

这是因为最终二进制文件关于k 的唯一信息是它是数据区中的一个符号。见:

(gdb) ptype k
type = <data variable, no debug info>

调试器(KDbg 在后台使用 GDB)无法知道它的大小,因此它只是猜测默认大小为 sizeof(int)。即使您通过 -F dwarf -g 选项在 NASM 中启用调试信息,它仍然不会显示任何实际的调试信息。

因此,让变量以正确的大小显示的唯一方法是手动指定它,例如 (short)k 而不是 k

关于linux - Kdbg 中显示的值是错误的 -- NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487045/

相关文章:

c - "Trace/breakpoint trap (core dumped)"在汇编中除以负值时出错

c - 从内核空间执行用户空间函数

linux - linux中 `echo ${#str}`是什么意思

ruby-on-rails - 如何在 Rails 的目录结构中查找文件

mysql - 如何导出mysql数据库

assembly - 通过bios中断获取要打印的字符串

c - 向 C 项目添加外部汇编器功能

assembly - #define 汇编中的替代方案?

Assembly .Data 初始化 4 位值

c - 从引导扇区到 C++ 内核