64位Windows中的程序集系统调用 [英] Assembly Syscalls in 64-bit Windows
问题描述
我使用的是Windows 10,安装了Cygwin。我一直在使用Cygwin编译/汇编c语言程序和使用Cygwin安装的"GCC"和"NASM"汇编程序。据我所知,NASM有一个-f win64模式,所以它可以汇编64位程序。现在,对于Windows上的x64汇编编程,YouTube似乎缺乏教程。YouTube上的大多数汇编编程教程要么适用于x64 Linux,要么适用于x32 Windows,我需要能够在x64 Windows上将字符串打印到控制台,而不需要使用任何外部函数,如C的"printf"。
对我无效的StackOverflow链接:
据我所知,NASM确实支持使用-f win64扩展名的64位Windows。此外,这些答案与如何在x64位Windows上用汇编语言编写实际程序无关How to write hello world in assembler under Windows?
所有给出代码的答案只给出了过时的Windows版本(32位)的代码,只有一个除外。我尝试了一个适用于64位的答案,但链接目标文件的命令给我一个错误,系统找不到指定的路径。
此站点不包含任何代码,这正是我所需要的。此外,我正在尝试用NASM编写Hello World程序。
64 bit assembly, when to use smaller size registers
这个问题实际上包含Hello World程序的代码,但当在Windows 10(我的设备)上的cygwin下执行时,我得到了一个分段错误。
Why does Windows64 use a different calling convention from all other OSes on x86-64?
我曾尝试使用objump-d反汇编C Hello World程序,但这调用了一个预构建的C函数printf,并且我正在尝试避免使用外部函数。
我尝试了其他外部函数(如Messagebox),但它们返回错误,因为有些东西无法识别这些函数。此外,如果可能,我正在尝试不使用任何外部函数,只使用syscall、sysenter或interrupts。
编码:
尝试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:Error:Inc.of opcode and操作数"
尝试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中的syscall的地址与Linux中的有很大不同。
推荐答案
尝试1:
尝试2:
Windows内部使用中断或系统调用。但是,它们没有正式文档记录,并且可能在Microsoft想要更改它们时随时更改:
只有少数.dll
文件直接使用系统调用指令;所有程序都直接或间接访问这些.dll
文件。
某个序列(例如mov rax, 5
、syscall
)可能具有在Windows更新之前打印出文本的含义,而Microsoft可能会将此序列的含义更改为在Windows更新后删除文件(&q;)。
为此,Microsoft只需替换正式允许使用syscall
指令的内核和.dll
文件。
调用Windows操作系统函数的唯一方法是调用.dll
文件中的函数,这与在C程序中执行此操作的方式相同。
示例(32位代码):
push 1
push msg
push 14
call _write
mov dword [esp], 0
call _exit
这篇关于64位Windows中的程序集系统调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!