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

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

问题描述:

如何测试k的值是否正确?Kdbg中显示的值是错误的 - NASM

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 m和苏亚雷斯值的k,m,rez值是得很好,但k的值是完全不同的,现在刚开始我还以为是随机的,但它似乎艰难它将rez的值作为一个8字节的数字而不是2个字节的数字读取,并且还读取了另外6个字节,并从m和rez中读取所有的set 1,这是错误的,所以我怎样才能正确显示它?

截图: enter image description here

+2

将表达式“(简写)k”添加到监视窗口中。 – Jester

我可以用你的源复制本(删除未定义的引用uslov)当我编译使用此命令行:

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

+0

这不是一个bug,你(和OP)根本没有包含该符号的任何*调试信息。 NASM不会将尺寸与基于'dd' /'dw' /'db'或其他任何其他指令/伪指令的标签关联起来。 (MASM甚至在'mov symbol,123'中暗示操作数大小,这与NASM不同)。 –

+0

如果你有'p&k',你会看到'$ 1 =( *)0x600104'。 GDB的默认解释是'int'。 –

+0

@PeterCordes啊,我明白了。所以你的意思是它只是符号表中的符号,而不是DWARF数据中的符号?将不得不重新检查。 – Ruslan