我有 Windows x64。我想使用 NASM 为这个系统在汇编程序中编写一些工作(尽管世界你好)。在 DosBox 下,一切都变得比以往更容易,在 dosbox 中编译、启动——它可以工作。
$ nasm -f bin code.asm -o main.com
在 Windows 下 - 不可能弄清楚是什么。试过:
$ nasm -f win64 code.asm -o main.exe
试过:
$ nasm -f win64 code.asm -o code.o
$ gcc code.o -o main.exe
试过:
$ nasm -f elf code.asm -o code.o
$ gcc code.o -o main.exe
没有任何效果。我不明白你为什么需要使用链接器?为什么dosbox代码只是一系列命令,而Windows代码由部分组成.text
,.data
而其他...
例如,我想在 Windows 上执行此操作,而不是在 DosBox 中:
mov ah, 0x2
mov dl, 'X'
int 0x21
ret
首先,这段代码根本无法在 Windows 上运行,中断在那里不起作用,您需要导入库并从中调用函数。
x86有内存保护,所以程序分为.data(这里是数据)和.text(这里是代码)。代码可以执行,但不能写入,数据也不能执行。也就是说,QMS 不会像在 MS-DOS 中那样工作,但如果你真的想这样做,没有什么能阻止你自己设置适当的节标志或使用为此设计的 API 函数。
还有其他几个部分,例如 .rsrc,其中存储资源(窗口、图像、字符串),.import,其中指定了导入的函数等
链接器有什么用?当编译器或汇编器在 Windows 下汇编代码时,它产生的不是完成的机器码,而是一个目标文件,目标文件是一个混合了符号的机器码,这是必要的,以便可以将静态库链接到程序。即如果汇编器中出现了一些call%external function%,那么在目标文件中指定了名称,而不是偏移量,链接器取库,将其添加到程序代码中,然后将名称替换为偏移量.
因此,Windows 根本不是 MS-DOS,对于不同的操作系统,汇编代码会有所不同(真的)。我建议您阅读 V. Pirogov 的《Windows 汇编程序》一书