Assembly 如何让nasm识别出这段代码是64位的?

Assembly 如何让nasm识别出这段代码是64位的?,assembly,nasm,Assembly,Nasm,我正在尝试在64位OSX计算机上使用nasm进行编译。然而,汇编器给我的错误似乎是因为它没有意识到这段代码是64位而不是32位。如何在不修改代码的情况下修复此问题 错误: $ nasm kernel64.asm -o kernel64.sys init_64.asm:153: error: symbol `lodsq' redefined init_net.asm:38: error: symbol `stosq' redefined init_net.asm:40: error: symbol

我正在尝试在64位OSX计算机上使用nasm进行编译。然而,汇编器给我的错误似乎是因为它没有意识到这段代码是64位而不是32位。如何在不修改代码的情况下修复此问题

错误:

$ nasm kernel64.asm -o kernel64.sys
init_64.asm:153: error: symbol `lodsq' redefined
init_net.asm:38: error: symbol `stosq' redefined
init_net.asm:40: error: symbol `stosq' redefined
init_net.asm:42: error: symbol `stosq' redefined
init_net.asm:49: error: symbol `stosq' redefined
init_net.asm:51: error: symbol `stosq' redefined
init_net.asm:53: error: symbol `stosq' redefined
syscalls/string.asm:363: error: parser: instruction expected
syscalls/screen.asm:264: error: symbol `jrcxz' redefined
syscalls/screen.asm:264: error: parser: instruction expected
syscalls/debug.asm:23: error: symbol `pushfq' redefined
syscalls/misc.asm:119: error: symbol `jrcxz' redefined
syscalls/misc.asm:119: error: parser: instruction expected
syscalls/misc.asm:126: error: symbol `jrcxz' redefined
syscalls/misc.asm:126: error: parser: instruction expected
syscalls/misc.asm:132: error: symbol `jrcxz' redefined
syscalls/misc.asm:132: error: parser: instruction expected
syscalls/misc.asm:326: warning: numeric constant 0x23D8AD1401DE7383 does not fit in 32 bits
syscalls/smp.asm:121: error: symbol `stosq' redefined
syscalls/smp.asm:123: error: symbol `stosq' redefined
syscalls/smp.asm:179: error: symbol `lodsq' redefined
syscalls/smp.asm:181: error: symbol `lodsq' redefined
drivers/net/rtl8169.asm:219: error: symbol `stosq' redefined
drivers/net/i8254x.asm:195: error: symbol `stosq' redefined
drivers/net/i8254x.asm:200: error: symbol `stosq' redefined
interrupt.asm:102: error: symbol `iretq' redefined
interrupt.asm:116: error: symbol `iretq' redefined
interrupt.asm:166: error: symbol `iretq' redefined
interrupt.asm:239: error: symbol `iretq' redefined
interrupt.asm:307: error: symbol `iretq' redefined
interrupt.asm:322: error: symbol `iretq' redefined
interrupt.asm:537: error: symbol `lodsq' redefined
cli.asm:22: error: symbol `jrcxz' redefined
cli.asm:22: error: parser: instruction expected
cli.asm:26: error: symbol `jrcxz' redefined
cli.asm:26: error: parser: instruction expected

我认为你的NASM版本太旧了。BareMetal操作系统安装说明页面上说要使用最新版本的NASM,即2.9.10(现在),您使用的是0.98.40版。NASM手册还规定:

NASM 2系列支持x86-64,是NASM自2007年以来的生产版本

报告说:

NASM将汇编源文件编译成可执行的二进制文件。NASM还用于编译在程序集中编写的任何应用程序。确保您使用的是最新版本的NASM,因为旧版本无法正常工作

因此,请安装最新版本


您的
nasm
版本是什么?@phoxis:
nasm版本0.98.40
如何覆盖我计算机上已有的版本?不同的问题。我从来没有用过OSX,只有win和*nix。从nasm下载源代码并编译和安装(使用提供的脚本)。结帐:@Adrian-一般来说,不要。如果NASM安装在
/usr/bin
中,则可以在
/usr/local/bin
中安装新版本。您可能需要使用完整的路径名来调用它,或者将其安装为
nasm-2.9
或其他什么,但是覆盖操作系统附带的程序通常不是一个好主意。@Chris Lutz:谢谢您的提醒。