Assembly 可以用汇编语言开发一个游戏吗?

Assembly 可以用汇编语言开发一个游戏吗?,assembly,Assembly,我想知道用汇编语言开发一个游戏需要什么。例如,在游戏开发中使用汇编语言有哪些限制或优势?此外,是否有任何程序/软件可以帮助用汇编语言开发游戏?是的,事实上这是可能的。俗话说, 只要你用心去做,任何事情都是可能的 很久以前的一款颇受欢迎的游戏,几乎完全是用x86汇编编写的,尽管使用了一些C函数与OS和DirectX进行接口 然而,正如你所想象的,这可能是非常痛苦的。高级语言的存在使事情变得更容易。我最喜欢的,C非常常用于接近金属的应用,被认为是相当低的级别 下面是一个从简单C函数(气泡排序,其中最

我想知道用汇编语言开发一个游戏需要什么。例如,在游戏开发中使用汇编语言有哪些限制或优势?此外,是否有任何程序/软件可以帮助用汇编语言开发游戏?

是的,事实上这是可能的。俗话说,

只要你用心去做,任何事情都是可能的

很久以前的一款颇受欢迎的游戏,几乎完全是用x86汇编编写的,尽管使用了一些C函数与OS和DirectX进行接口

然而,正如你所想象的,这可能是非常痛苦的。高级语言的存在使事情变得更容易。我最喜欢的,
C
非常常用于接近金属的应用,被认为是相当低的级别

下面是一个从简单C函数(气泡排序,其中最简单的一个)到x64程序集的直接转换示例:

C():
现在,在这个时代,人们期望他们的程序能快速运行。如果你;如果要做任何花哨的事情或使用大量数据,您需要优化的代码。下面是经过完全优化的相同代码的外观:

x64具有针对通用CPU的完整架构优化(
-O3-march=corei7
;): 等一下。它看起来短多了。当然但是你能告诉我哪些指令应该放在哪里,它是如何对指令重新排序的,或者应该使用什么组合吗?编译器可以


总而言之,在汇编中编写游戏可能是一个非常糟糕的主意。最好使用C等编译语言编写游戏,并在以后的汇编中手动重写一两个函数

如果确实有许多常见的实例,其中您的手写程序集在最大优化方面优于编译器,那么您可能应该通知该编译器的开发人员,以便他们可以与您合作添加您想要的优化。这将允许您只让编译器执行同样的操作,而无需您在将来进行干预

编译器内部函数通常允许您在汇编中执行许多操作。见鬼,您甚至可以通过使用编译器内部函数编写接近纯MMX/SSE/SSSE/AVX的代码,同时让编译器进一步优化它,很好地分配寄存器,并将其与代码的其余部分集成。

是的,事实上这是可能的。俗话说,

只要你用心去做,任何事情都是可能的

很久以前的一款颇受欢迎的游戏,几乎完全是用x86汇编编写的,尽管使用了一些C函数与OS和DirectX进行接口

然而,正如你所想象的,这可能是非常痛苦的。高级语言的存在使事情变得更容易。我最喜欢的,
C
非常常用于接近金属的应用,被认为是相当低的级别

下面是一个从简单C函数(气泡排序,其中最简单的一个)到x64程序集的直接转换示例:

C():
现在,在这个时代,人们期望他们的程序能快速运行。如果你;如果要做任何花哨的事情或使用大量数据,您需要优化的代码。下面是经过完全优化的相同代码的外观:

x64具有针对通用CPU的完整架构优化(
-O3-march=corei7
;): 等一下。它看起来短多了。当然但是你能告诉我哪些指令应该放在哪里,它是如何对指令重新排序的,或者应该使用什么组合吗?编译器可以


总而言之,在汇编中编写游戏可能是一个非常糟糕的主意。最好使用C等编译语言编写游戏,并在以后的汇编中手动重写一两个函数

如果确实有许多常见的实例,其中您的手写程序集在最大优化方面优于编译器,那么您可能应该通知该编译器的开发人员,以便他们可以与您合作添加您想要的优化。这将允许您只让编译器执行同样的操作,而无需您在将来进行干预


编译器内部函数通常允许您在汇编中执行许多操作。见鬼,您甚至可以使用编译器内部函数编写接近纯MMX/SSE/SSSE/AVX的代码,同时让编译器继续对其进行优化,很好地分配寄存器,并将其与代码的其余部分集成。

如果您想努力工作,每件事都是可能的……)当然这是可能的。一切最终都会在CPU上作为程序集执行。这不是一件容易的事,而且您将没有任何可用于更高级语言和框架的工具。但是这是可能的。
是否有任何程序/软件可以帮助用汇编语言开发游戏
-是的,它被称为“编译器”,我不知道汇编语言在哪个应用领域会成为当今的首选语言。可能是一些小型嵌入式设备,但即使在这些情况下,C也经常可用。如果我们使用更高级别的语言将其与相同的语言进行比较,那么您的汇编效率基本为零。开发游戏不需要组装。如果你想要一种更高级的语言,而这种语言又受到系统编程的影响,那就使用C/C++吧。即使你想要低级别的优化,你也可以通过使用C/C++内部函数在没有asm的情况下完成,但是很少有高规格的游戏需要这样做,而且只有在某些平台上。@Zboson我的说法仍然成立。手工制作的asm总是比编译的asm快,但通常差别不大,而且asm的开发/维护成本往往不值得费心。即使我们提到一个进行科学计算的应用程序:使用这样一个库意味着你的应用程序的一个或多个小部分(例如:矩阵乘法器)得到了优化。仍然值得用更高级的语言编写应用程序的其余部分。优化!=如果你想努力工作,每件事都是可能的当然了
void bubble_sort (int *a, int n) {
    int i, t, s = 1;
    while (s) {
        s = 0;
        for (i = 1; i < n; i++) {
            if (a[i] < a[i - 1]) {
                t = a[i];
                a[i] = a[i - 1];
                a[i - 1] = t;
                s = 1;
            }
        }
    }
}
bubble_sort:
    push    rbp
    mov rbp, rsp
    mov QWORD PTR [rbp-24], rdi
    mov DWORD PTR [rbp-28], esi
    mov DWORD PTR [rbp-8], 1
    jmp .L2
.L6:
    mov DWORD PTR [rbp-8], 0
    mov DWORD PTR [rbp-4], 1
    jmp .L3
.L5:
    mov eax, DWORD PTR [rbp-4]
    cdqe
    lea rdx, [0+rax*4]
    mov rax, QWORD PTR [rbp-24]
    add rax, rdx
    mov edx, DWORD PTR [rax]
    mov eax, DWORD PTR [rbp-4]
    cdqe
    sal rax, 2
    lea rcx, [rax-4]
    mov rax, QWORD PTR [rbp-24]
    add rax, rcx
    mov eax, DWORD PTR [rax]
    cmp edx, eax
    jge .L4
    mov eax, DWORD PTR [rbp-4]
    cdqe
    lea rdx, [0+rax*4]
    mov rax, QWORD PTR [rbp-24]
    add rax, rdx
    mov eax, DWORD PTR [rax]
    mov DWORD PTR [rbp-12], eax
    mov eax, DWORD PTR [rbp-4]
    cdqe
    lea rdx, [0+rax*4]
    mov rax, QWORD PTR [rbp-24]
    add rdx, rax
    mov eax, DWORD PTR [rbp-4]
    cdqe
    sal rax, 2
    lea rcx, [rax-4]
    mov rax, QWORD PTR [rbp-24]
    add rax, rcx
    mov eax, DWORD PTR [rax]
    mov DWORD PTR [rdx], eax
    mov eax, DWORD PTR [rbp-4]
    cdqe
    sal rax, 2
    lea rdx, [rax-4]
    mov rax, QWORD PTR [rbp-24]
    add rdx, rax
    mov eax, DWORD PTR [rbp-12]
    mov DWORD PTR [rdx], eax
    mov DWORD PTR [rbp-8], 1
.L4:
    add DWORD PTR [rbp-4], 1
.L3:
    mov eax, DWORD PTR [rbp-4]
    cmp eax, DWORD PTR [rbp-28]
    jl  .L5
.L2:
    cmp DWORD PTR [rbp-8], 0
    jne .L6
    pop rbp
    ret
bubble_sort:
    lea eax, [rsi-2]
    cmp esi, 1
    lea r8, [rdi+8+rax*4]
    jg  .L11
    rep; ret
.L11:
    add rdi, 4
.L3:
    mov rax, rdi
    xor esi, esi
.L6:
    mov edx, DWORD PTR [rax]
    mov ecx, DWORD PTR [rax-4]
    cmp edx, ecx
    jge .L4
    mov DWORD PTR [rax], ecx
    mov esi, 1
    mov DWORD PTR [rax-4], edx
.L4:
    add rax, 4
    cmp rax, r8
    jne .L6
    test    esi, esi
    jne .L3
    rep; ret