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,这是错误的,所以我怎样才能正确显示它?
我可以用你的源复制本(删除未定义的引用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
。
这不是一个bug,你(和OP)根本没有包含该符号的任何*调试信息。 NASM不会将尺寸与基于'dd' /'dw' /'db'或其他任何其他指令/伪指令的标签关联起来。 (MASM甚至在'mov symbol,123'中暗示操作数大小,这与NASM不同)。 –
如果你有'p&k',你会看到'$ 1 =( *)0x600104'。 GDB的默认解释是'int'。 –
@PeterCordes啊,我明白了。所以你的意思是它只是符号表中的符号,而不是DWARF数据中的符号?将不得不重新检查。 – Ruslan
将表达式“(简写)k”添加到监视窗口中。 – Jester