如何测试 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,这是错误的,所以我如何显示正确吗?
最佳答案
当我使用此命令行编译时,我可以使用您的源代码重现此内容(删除对 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/