0

如何测试以查看 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

当我尝试检查k,m,rezkdbg 中的值时,m 和 rez 的值很好,但 k 的值完全不同,现在起初我认为它是随机的,但它似乎很难将 rez 的值读取为8个字节数而不是2个字节数,并且还从m和rez中读取了所有集合1的6个字节,这是错误的,那么我怎样才能正确显示它?

截屏: 在此处输入图像描述

4

1 回答 1

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.

于 2017-11-25T15:06:14.500 回答