64 位 Windows 中的汇编系统调用

2023-11-24

我使用的是 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 中的地址有很大不同。


尝试#1:

尝试#2:

Windows 在内部使用中断或系统调用。然而它们没有正式记录并且可能会改变任何时候微软想要改变它们:

只有一点.dll文件直接使用系统调用指令;所有程序都直接或间接访问这些.dll files.

一定的顺序(例如mov rax, 5, syscall)在 Windows 更新之前可能具有“打印出文本”的含义,并且 Microsoft 可能会在 Windows 更新之后将此序列的含义更改为“删除文件”。

为此,微软只需更换内核和.dll正式“允许”使用的文件syscall操作说明。

调用 Windows 操作系统函数以确保您的程序在下一次 Windows 更新后仍能正常工作的唯一方法是调用.dll文件 - 与在 C 程序中执行此操作的方式相同。

示例(32 位代码):

push 1
push msg
push 14
call _write
mov dword [esp], 0
call _exit
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64 位 Windows 中的汇编系统调用 的相关文章

随机推荐