从书本中学习汇编语言时,有一个清单显示了一些基本操作:
segment .data
a dq 176
b dq 4097
segment .text
global _start
_start:
mov rax, [a] ; Move a into rax.
add rax, [b] ; add b o rax.
xor rax, rax
ret
使用"$yasm -f elf64 -g dwarf2 -l listing.lst listing.asm"
命令组装并与"$ld -o listing listing.o"
链接后,我在gdb中运行了该程序。每当我尝试打印变量的值时,gdb都会显示以下错误消息:
(gdb) p a
'a' has unknown type; cast it to its declared type
与其他变量“ b”相同。但是,将int转换为“ a”或“ b”是可行的:
(gdb) p (int)a
$11 = 176
(gdb) p (int)b
$12 = 4097
但这不应该在不进行强制转换的情况下起作用吗?为什么我需要投射?我在源文件中犯了什么错误?
答案 0 :(得分:1)
但这不应该在不进行强制转换的情况下起作用吗?
不。 GDB告诉您,它不知道类型 a
和b
是什么。
我在源文件中犯了什么错误?
您没有犯任何错误,但是您也没有提供GDB可以使用的任何调试信息。
您可能曾期望yasm -g dwarf2 ...
这样做,但是它只会创建描述源代码的 minimum 调试信息,
$ readelf -wi listing.o
Contents of the .debug_info section:
Compilation Unit @ offset 0x0:
Length: 0x37 (32-bit)
Version: 2
Abbrev Offset: 0x0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_stmt_list : 0x0
<10> DW_AT_low_pc : 0x0
<18> DW_AT_high_pc : 0x14
<20> DW_AT_name : listing.asm
<28> DW_AT_comp_dir : /tmp/
<2e> DW_AT_producer : yasm 1.3.0
<39> DW_AT_language : 32769 (MIPS assembler)
答案 1 :(得分:1)
较早的GDB在没有描述大小/类型的调试信息的情况下,默认假定该符号为int
。
与当前行为相比,这通常会导致更多混乱,因此将其更改。例如The value displayed in Kdbg is wrong -- NASM