我使用的是 Windows 10,安装了 Cygwin。我一直使用 Cygwin 来使用 Cygwin 安装的“gcc”和“nasm”来编译/汇编 c 和汇编程序。据我所知,nasm有一个-f win64模式,因此它可以汇编64位程序。现在,对于 Windows 上的 x64 汇编编程,youtube 似乎缺乏教程。 youtube 上的大多数汇编编程教程要么适用于 x64 linux,要么适用于 x32 windows,我需要能够在 x64 windows 上将字符串打印到控制台,而不使用任何外部函数,例如 C 的“printf”。
StackOverflow 链接对我不起作用:
64 位 Windows 汇编器
据我所知,nasm 确实使用 -f win64 扩展支持 64 位 Windows。另外,答案与如何在 x64 位 Windows 上用汇编语言编写实际程序无关
Windows下如何用汇编程序编写hello world?
所有给出代码的答案都只给出过时的 Windows 版本(32 位)的代码,除了一个。我尝试了适用于 64 位的一个答案,但是链接目标文件的命令给了我一个错误,即系统找不到指定的路径。
Windows x64 汇编程序?
该网站不包含任何代码,这正是我所需要的。另外,我正在尝试用 nasm 编写 Hello World 程序。
64 位汇编,何时使用较小尺寸的寄存器
该问题实际上包含 hello world 程序的代码,但是当在 Windows 10(我的设备)上的 cygwin 下执行时,我遇到分段错误。
为什么 Windows64 使用与 x86-64 上所有其他操作系统不同的调用约定?
我尝试使用 objdump -d 反汇编 C Hello World 程序,但这会调用 printf(一个预构建的 C 函数),并且我试图避免使用外部函数。
我尝试过其他外部函数(例如 Messagebox),但它们返回错误,因为某些东西无法识别这些函数。另外,如果可能的话,我尝试不使用任何外部函数,仅使用系统调用、系统输入或中断。
CODE:
尝试#1:
section .data
msg db "Hello, World!", 10, 0
section .text
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 14
syscall
mov rax, 60
mov rdi, 0
syscall
问题:正确组装和链接,但运行时抛出分段错误。
尝试#2:
section .text
mov ah, 0eh
mov al, '!', 0
mov bh, 0
mov bl, 0
int 10h
问题:组装不正确;说“test.asm:3:错误:操作码和操作数的组合无效”
尝试#3:
section .text
msg db 'test', 10, 0
mov rdi, 1
mov rsi, 1
mov rdx, msg
mov rcx, 5
syscall
mov rdi, 60
mov rsi, 0
syscall
问题:正确组装和链接,但运行时抛出分段错误。
尝试#4:
section .text
mov ah, 0eh
mov al, '!'
mov bh, 0
mov bl, 0
int 10h
问题:正确组装和链接,但运行时抛出分段错误。
我只需要一个在 64 位 Windows 10 上运行的 hello world 汇编程序的示例。32 位程序在运行时似乎返回错误。如果不使用外部函数就无法将字符串打印到控制台,那么使用外部函数并在 64 位 Windows 10 上运行的程序示例会很好。
我听说 Windows 中的系统调用的地址与 Linux 中的地址有很大不同。