64位Windows中的程序集系统调用 [英] Assembly Syscalls in 64-bit Windows

查看:0
本文介绍了64位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链接:

64-bit windows assembler

据我所知,NASM确实支持使用-f win64扩展名的64位Windows。此外,这些答案与如何在x64位Windows上用汇编语言编写实际程序无关

How to write hello world in assembler under Windows?

所有给出代码的答案只给出了过时的Windows版本(32位)的代码,只有一个除外。我尝试了一个适用于64位的答案,但链接目标文件的命令给我一个错误,系统找不到指定的路径。

windows x64 assembler?

此站点不包含任何代码,这正是我所需要的。此外,我正在尝试用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, 5syscall)可能具有在Windows更新之前打印出文本的含义,而Microsoft可能会将此序列的含义更改为在Windows更新后删除文件(&q;)。

为此,Microsoft只需替换正式允许使用syscall指令的内核和.dll文件。

调用Windows操作系统函数的唯一方法是调用.dll文件中的函数,这与在C程序中执行此操作的方式相同。

要确保您的程序在下一次Windows更新后仍能正常运行,唯一的方法就是调用文件中的函数。

示例(32位代码):

push 1
push msg
push 14
call _write
mov dword [esp], 0
call _exit

这篇关于64位Windows中的程序集系统调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆