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

时间:2017-11-25 14:26:13

标签: 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

1 个答案:

答案 0 :(得分:3)

当我使用此命令行编译时,我可以使用您的源重现(删除对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