如何测试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,这是错误的,那么如何才能正确显示?
答案 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
。