2017-11-25 160 views
0

如何測試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,這是錯誤的,所以我怎樣才能正確顯示它?

截圖: enter image description here

+2

將表達式「(簡寫)k」添加到監視窗口中。 – Jester

回答

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

+0

這不是一個bug,你(和OP)根本沒有包含該符號的任何*調試信息。 NASM不會將尺寸與基於'dd' /'dw' /'db'或其他任何其他指令/僞指令的標籤關聯起來。 (MASM甚至在'mov symbol,123'中暗示操作數大小,這與NASM不同)。 –

+0

如果你有'p&k',你會看到'$ 1 =( *)0x600104'。 GDB的默認解釋是'int'。 –

+0

@PeterCordes啊,我明白了。所以你的意思是它只是符號表中的符號,而不是DWARF數據中的符號?將不得不重新檢查。 – Ruslan